java设计模式--[结构模式]--装饰者模式[decorator pattern]

2023-10-31

一. 裝飾者模式

裝飾者模式,又叫包裝器,動態地給動象添加一些額外的職責,若要擴展功能,裝飾者指供了比繼承更有彈性的替代方案.

 

二. 裝飾者模式的UML類圖如下:
    

 

三. 本節內容以一個點餐配菜的案例來說明裝飾者模式的用法,完整代碼如下:

 

1.  主食類超類:

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: StapleFood 
 * @Description:主食類[抽象組件]
 * @author Liyongbin
 * @date 2011-2-7 下午09:43:39 
 * @version V1.0
 */
public abstract class StapleFood {
	private String description ="Unknown StapleFood";
	/**
	 * 主食的描述[主食名稱]
	 * @return
	 */
	public String getDescription(){
		return description;
	}
	
	/**
	 * 主食的價格
	 * @return
	 */
	public abstract double cost();
}

 

2. 菜類的超類

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: Dish 
 * @Description: 菜類
 * @author Liyongbin
 * @date 2011-2-7 下午09:53:11 
 * @version V1.0
 */
public abstract class Dish extends StapleFood {
	
	//繼承了主食類的描述[菜的名字]
	public abstract String getDescription() ;
}

 

3. 主食類的派生類_米飯類

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: Rice 
 * @Description: 米飯_主食_具體組件
 * @author Liyongbin
 * @date 2011-2-7 下午09:56:26 
 * @version V1.0
 */
public class Rice extends StapleFood {

	@Override
	public String getDescription() {
		return "泰國香米";
	}
	
	@Override
	public double cost() {
		return 5.0;
	}
}

 

4. 主食類的派生類_面食類

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: Rice 
 * @Description: 面飯_主食_具體組件
 * @author Liyongbin
 * @date 2011-2-7 下午09:56:26 
 * @version V1.0
 */
public class Noodle extends StapleFood {

	@Override
	public String getDescription() {
		return "面飯";
	}
	
	@Override
	public double cost() {
		return 4.0;
	}
}

 

5. 菜類的派生類: 雞肉

package structuralPattern.decorator.decorator2;

public class Chicken extends Dish {
	//
	private StapleFood stapleFood;

	//
	public Chicken(StapleFood stapleFood) {
		this.stapleFood = stapleFood;
	}

	主食的名稱+雞肉的名稱
	@Override
	public String getDescription() {
		return stapleFood.getDescription() + ",辣子雞";
	}

	//主食的價格+雞肉的價格
	@Override
	public double cost() {
		return stapleFood.cost()+12.0d ;
	}
}

 

6. 菜類的派生類: 魚肉

package structuralPattern.decorator.decorator2;

public class Fish extends Dish {
	//
	StapleFood stapleFood;

	//
	public Fish(StapleFood stapleFood) {
		this.stapleFood = stapleFood;
	}

	主食的名稱+魚肉的名稱
	@Override
	public String getDescription() {
		return stapleFood.getDescription() + ",烏江魚";
	}

	//主食的價格+魚肉的價格
	@Override
	public double cost() {
		return stapleFood.cost()+10.0d ;
	}
}

 

7. 菜類的派生類: 鴨肉

package structuralPattern.decorator.decorator2;

public class PekingDuck extends Dish {
	//
	StapleFood stapleFood;

	//
	public PekingDuck(StapleFood stapleFood) {
		this.stapleFood = stapleFood;
	}

	主食的名稱+鴨肉的名稱
	@Override
	public String getDescription() {
		return stapleFood.getDescription() + ",北京烤鴨";
	}

	//主食的價格+鴨肉的價格
	@Override
	public double cost() {
		return stapleFood.cost()+25.0d ;
	}
}

  

 8. 菜類的派生類: 羊肉

package structuralPattern.decorator.decorator2;

public class Mutton extends Dish {
	//
	StapleFood stapleFood;
	//
	public Mutton(StapleFood stapleFood) {
		this.stapleFood = stapleFood;
	}
	//主食的名稱+羊肉的名稱
	@Override
	public String getDescription() {
		return stapleFood.getDescription() + ",小肥羊";
	}
	//主食的價格+羊肉的價格
	@Override
	public double cost() {
		return stapleFood.cost()+30.0d ;
	}
}

 

 9. 點餐測試類

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: DecoratorTest 
 * @Description:點餐測試
 * @author Liyongbin
 * @date 2011-2-7 下午09:12:46 
 * @version V1.0
 */
public class DecoratorTest {
	public static void main(String[] args) {
		//無菜面飯[¥4]
		StapleFood noodle0 = new Noodle();
		System.out.println(noodle0.getDescription()+" ¥"+noodle0.cost());
		
		//帶菜(雞肉[¥12],魚肉[¥10])面飯[¥4]
		StapleFood noodle1 = new Noodle();
		noodle1=new Chicken(noodle1);
		noodle1=new Fish(noodle1);
		System.out.println(noodle1.getDescription()+" ¥"+noodle1.cost());
		
		//無菜的米飯[¥5]
		StapleFood rice0 = new Rice();
		System.out.println(rice0.getDescription()+" ¥"+rice0.cost());
		
		//帶菜(雞肉[¥12],魚肉[¥10],羊肉[¥30],鴨肉[¥25])的米飯[¥5]
		StapleFood rice1 = new Rice();
		rice1=new Chicken(rice1);
		rice1=new Fish(rice1);
		rice1=new Mutton(rice1);
		rice1=new PekingDuck(rice1);
		System.out.println(rice1.getDescription()+" ¥"+rice1.cost());
	}
}

 

 10. 運行結果如下:


   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java设计模式--[结构模式]--装饰者模式[decorator pattern] 的相关文章

  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • Android:如何暂停和恢复可运行线程?

    我正在使用 postDelayed 可运行线程 当我按下按钮时 我需要暂停并恢复该线程 请任何人帮助我 这是我的主题 protected void animation music6 music4 postDelayed new Runnab
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • 为什么在将 String 与 null 进行比较时会出现 NullPointerException?

    我的代码在以下行中出现空指针异常 if stringVariable equals null 在此语句之前 我声明了 stringVariable 并将其设置为数据库字段 在这个声明中 我试图检测该字段是否有null值 但不幸的是它坏了 有
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐

  • pyqt5的QWebEngineView无法播放网络视频

    这个问题是2021年中旬遇到的 最近系统重装又出现这个问题所以解决并记录一下 具体就是可以实现打开网页 但是如果是视频链接就无法播放 例如 做类似抖音 快手网页版的视频播放器 或者其他类型的视频播放器等等如封面图 都会遇到只有黑窗口但无法播
  • 全网最火Java面试题

    第一部分 JAVA 基础 第一节 IO NIO 第二节 反射 第三节 多线程 第四节 集合 第五节 Web 第六节 其他 第七节 关键字 第八节 操作符 第九节 基础类型 第十节 异常 第十一节 JDBC 第十二节 OOP 第二部分 JVM
  • 深入理解Qt4/Qt5信号和槽机制

    对于事件处理 MFC中使用的是消息映射机制 Qt使用的是信号和槽机制 在我看来 Qt的信号和槽比MFC功能更强大 也更灵活 1 信号和槽的简单介绍 一般格式 connect Sender SIGNAL signal Receiver SLO
  • C++派生类的不同继承方式对基类的访问权限

    经过我细心的整理 形成了这张表 一张表说明派生类的不同继承方式 对基类的访问权限 总的来说 对类的访问权限范围public
  • 2022 CISCN初赛 Satool

    一个2022年国赛初赛的LLVM PASS类pwn题 当时还完全没有接触过 所以直接放弃掉了 初赛结束之后决定入门一下这方面知识 看这篇题解之前最好先看看之前写的这篇入门文章 LLVM PASS类pwn题入门 然后我们正式开始这道题 首先从
  • 07-js 逆向-返回数据加密(aes)

    目标 返回的结果有加密 把结果解密 可以看到返回来的data是加密的 但是加密的数据并没有进行混淆 这时候我们可以采用直接搜解密 decrypt 直接发先我们的数据书通过aes加密的 我们开始些python代码 from Crypto Ci
  • vndk: (native:vendor) should not link to libcamera_client (native:platform)

    1 0 相似例子 2 21 17 47 30 305 4365 4365 E CamX ERROR UTILS camxosutilslinux cpp 874 LibMap dlopen dlopen failed library lib
  • 利用mimikatz查看rdp连接密码【渗透测试】

    0x00 概述 在使用 rdp 时会发现系统有保存连接密码的功能 一定在本地以一种加密方式保存 在连接的时候解密进行rdp尝试 那么我们能不能那到加密的密码解密以获取这台机器rdp连接过的机器呢 0x01 流程 AppData Local
  • PUMA:DOA估计模式的改进实现(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 文献来源 下载链接 PUMA An Imp
  • ue4添加第三方库

    查了一些资料 发现最后都是用loadlibrary的方式 这样很不方便 如果有10000个函数 要写10000次么 仔细想想 调用第三方库无非就是把头文件和lib库设置下 把相应的 h lib和 dll放到相应的位置 再在调用的地方包含头文
  • cadence原理图封装pin名称重复_Cadence原理图库文件引脚名重复处理方法介绍

    立题简介 内容 Cadence原理图库文件引脚名重复处理方法 来源 实际使用得出 作用 介绍2种处理Cadence原理图库文件引脚名的方法 PCB环境 Cadence 16 6 orCAD环境 日期 2019 03 09 分割线 立题详解
  • spring打印http接口请求和响应

    在程序日志中打印出接口请求和响应的内容是一个基本的技术需求 如果在每个接口中实现请求响应的日志打印 程序编写会很繁琐 我们可以利用spring提供的机制 集中处理接口请求响应的日志打印 具体的代码参照 示例项目 https github c
  • 使用ipmitool命令检测电源模块状态

    1 通过ipmitool检查电源模块状态 https mp weixin qq com s Z1g79Q1aMhOT9Xm9fvIkjg 2 通过ipmitool获取服务器各元件温度信息 https mp weixin qq com s E
  • 大数据分布式计算开源框架Hadoop的介绍和运用

    Hadoop是Apache开源组织的一个分布式计算开源框架 在很多大型网站上都已经得到了应用 如亚马逊 Facebook和Yahoo等等 对于我来说 最近的一个使用点就是服务集成平台的日志分析 服务集成平台的日志量将会很大 而这也正好符合了
  • vue 快速自定义分页el-pagination

    vue 快速自定义分页el pagination template div style text align center div
  • main函数中的参数代表的意义

    int main int argc char argv 或者是 int main int argc char argv 里面的参数是什么意义呢 argc 是 argument count的缩写 表示传入main函数的参数个数 argv 是
  • 分享一个完整的Mybatis分页解决方案

    原文地址 http duanhengbin iteye com blog 1998017 参考地址 http blog csdn net isea533 article details 23831273 Mybatis 的物理分页是应用中的
  • 一起学ORBSLAM2(11)ORBSLAM的localmapping

    转载请注明原创地址 https blog csdn net qq 30356613 article category 6897125 ORBSLAM的局部建图线程实际做的工作是来维护全局map以及管理关键帧的 对tracking得到的关键帧
  • HWND转成CWnd

    在Dialog调用中调用系统的Create函数时 遇到了这个问题 BOOL CWnd Create LPCTSTR lpszClassName LPCTSTR lpszWindowName DWORD dwStyle const RECT
  • java设计模式--[结构模式]--装饰者模式[decorator pattern]

    一 裝飾者模式 裝飾者模式 又叫包裝器 動態地給動象添加一些額外的職責 若要擴展功能 裝飾者指供了比繼承更有彈性的替代方案 二 裝飾者模式的UML類圖如下 三 本節內容以一個點餐配菜的案例來說明裝飾者模式的用法 完整代碼如下 1 主食類超類