`
风雪涟漪
  • 浏览: 510823 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9170
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18632
社区版块
存档分类
最新评论

装饰者模式(Decorator Pattern) 追MM

阅读更多

装饰者模式

MM们要过生日了 ,怎么也得表示下吧。最起码先送个蛋糕。蛋糕多种多样了。巧克力,冰淇淋,奶油等等。这都是基本的了 ,再加点额外的装饰,如蛋糕里放点花。放贺卡。放点干果吃着更香等等。看看我是如何设计的。

      我想既然是蛋糕,那我就把蛋糕作为一个抽象类,剩下的蛋糕子类型来继承它,每个子类都有吃该蛋糕的感觉 ^_^,看起来真的不错。蛋糕的子类分别是奶酪蛋糕,巧克力蛋糕,冰淇淋蛋糕,插花的冰淇淋蛋糕,放贺卡的冰淇淋蛋糕。某个MM的生日蛋糕喜欢带花的冰淇淋蛋糕。还好我早有准备。但是有几次失策了。。她们要的蛋糕我这都没有。比如带鲜花的巧克力蛋糕。带果仁的牛奶蛋糕。带鲜花带果仁的蛋糕。。。。那我还要继续添加蛋糕的子类。。问题出现了。这样会造成大量的蛋糕子类 。真是噩梦啊。

 

那么我要好好思考这个问题了。发现了刚才的设计确实有问题。。发现了真正的要关注的主体是蛋糕。。而贺卡,花,果仁等等只不过是装饰 的作用。

 

思路来了。蛋糕作为主体,其他的东西都加到蛋糕上。MM要啥我就加啥呗。呵呵。

到现在我们要明确的是:

  • 蛋糕是主体。
  • 花,贺卡,果仁等等是装饰者。
  • 可以用装饰者包装蛋糕。

来看看什么是装饰器模式吧:

动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

 


  • Component:抽象出的主体对象。
  • ConcreteComponent:是要动态扩展的对象,它继承自Component.
  • Decorator:是装饰器的接口。(这里的接口并不是指java的interface)。
  • ConcreteDecoratorA:实现Decorator的类,包含了一个Component引用,这样就可以扩展Component的方法了。

说完理论了。可能还一头雾水吧。。。还是接着蛋糕的例子继续说。先看图吧。



基本符合了上面所提到的装饰者模式的框架结构了。再看看代码:

Cake

package decorator.demo;

/**
 * 蛋糕基类
 * @author Nicholas
 *
 */
public abstract class Cake {
	String remark = "蛋糕";
	public String getRemark() {
		return remark;
	}
	public abstract String getImpression();//用来描述吃蛋糕的感觉。。。。
}

 Cake是个抽象类,它已经实现了getRemark的方法。但没有实现getImpression.这个方法必须被子类实现。

 

再看看装饰器的抽象类

OtherDecorator

package decorator.demo;

/**
 * 其他用来添加蛋糕的东西
 * @author Nicholas
 *
 */
public abstract class OtherDecorator extends Cake{
	Cake cake;
	/**
	 * 引用一个Cake.
	 * 让被装饰者进入装饰者之中。这里用的是构造方法注入。
	 * 这样就可以调用Cake实例的方法了。
	 * @param cake
	 */
	public OtherDecorator(Cake cake){
		this.cake=cake;
	}
	/**
	 * 让装饰器的子类都去实现getRemark方法。业务需要每个装饰器都要有描述。
	 */
	public abstract String getRemark();
}
 

下面让我们实现一个蛋糕吧。^_^。。

package decorator.demo;
/**
 * 乳酪蛋糕
 * @author Nicholas
 *
 */
public class CheeseCake extends Cake{
	/**
	 * 乳酪蛋糕的构造方法
	 */
	public CheeseCake(){
		super.remark="乳酪蛋糕";//修改乳酪蛋糕的描述。
	}

	/**
	 * 实现了Cake抽象类的getImpression
	 * 吃乳酪蛋糕的感觉。。
	 */
	public String getImpression() {
		return "香甜感受";
	}

}
 

其他实现Cake的类就不列出了,道理是一样的。

下面我们要开始实现具体的装饰器了。

package decorator.demo;

/**
 * 给蛋糕添加的花
 * @author Nicholas
 *
 */
public class FlowerDecorator extends OtherDecorator{
	
	/**
	 * 构造函数
	 * 传入一个cake实例,也就是前面所实现的Cake的子类,如奶酪蛋糕,巧克力蛋糕等等。
	 * @param cake
	 */
	public FlowerDecorator(Cake cake){
		super(cake);//调用父类的构造方法,可以获取Cake的实例了。就可以调用Cake实例的方法.
		super.remark="一朵玫瑰花";
	}
	
	/**
	 * 实现了装饰器抽象类的getImpression方法。
	 */
	public String getImpression() {
		//这是重点。我们通过构造方法传入的cake实例。对cake进行了装饰,增加了新的功能。
		return cake.getImpression()+","+"看到一朵花真是happy";
	}

	public String getRemark() {
		return cake.getRemark()+"+"+super.remark;
	}
}

 到现在终于大功告成了。。这样方便了很多,可以通过装饰器生成很多种类的蛋糕。

package decorator.demo;

public class MyGirlB {
	public static void main(String[] args){
		//用果仁,花包装巧克力蛋糕。
		Cake nutsFlowerChocolateCake = new NutsDecorator(new FlowerDecorator(new ChocolateCake()));
		System.out.println("remark "+nutsFlowerChocolateCake.getRemark());
		//吃蛋糕的感受已经发生了改变。
		System.out.println("impression "+nutsFlowerChocolateCake.getImpression());
	}
}
 

这个模式的缺点也挺明显的 ,看看如下图片


 

 

为了扩展cake的功能,加入了许多的装饰类。。当然用户也可以继承OtherDecorator来继续扩展。但是对API使用者是个困扰。。所以API要说明哪些类是用来包装的。。

 

 

 

  • 大小: 35.4 KB
  • 大小: 16.1 KB
  • 大小: 55.4 KB
  • 大小: 11.3 KB
分享到:
评论
2 楼 king_jjjj 2010-01-06  
你没有说出问题的本质。装饰的重点不在你说的地方,而在于主体和装饰者的关系。你的例子没有围绕重点去讲。只能说是一般性的理解。
1 楼 iXh 2009-02-20  
打酱油。。。

相关推荐

    java23种设计模式与追MM下载地址

    ### 装饰器模式(Decorator Pattern) 装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。在Java中,装饰器模式经常用于处理流...

    23种设计模式趣解.txt

    #### 装饰器模式(Decorator Pattern) 装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。在文中提供的例子中,Mike需要为Mary...

    23种设计模式超级经典解释!!

    9. **装饰器模式**(Decorator Pattern) 装饰器模式在不改变原有对象的基础上,动态地给对象添加新的功能。例如,给照片添加祝福语,以创建独特的生日礼物。装饰器模式避免了大量子类的生成,保持了类的封装性。 ...

    谈Java的23种设计模式

    除了以上这些模式,还有许多其他的设计模式,如装饰器模式(Decorator)、观察者模式(Observer)、代理模式(Proxy)、桥接模式(Bridge)、责任链模式(Chain of Responsibility)、命令模式(Command)、解释器...

    基于javaweb的学生宿舍管理系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    最新更新!!国家农业龙头企业数量(2010-2022年)

    ## 1、数据简介 国家农业龙头企业数量主要指的是经过国家相关部门认定,并在农业产业化方面发挥重要引领作用的企业的总数。这些企业通常以农产品加工或流通为主业,通过各种利益联结机制与农户相联系,带动农户进入市场,实现农产品生产、加工、销售的有机结合和相互促进。 数据名称:国家农业龙头企业数量 数据年份:2010-2022年 ## 02、相关数据 省份、年份、龙头企业数量。

    基于struts2+spring+mybites的二手车交易信息网站(毕设&课设&实训&大作业&竞赛&项目)

    这是一个二手车交易信息网站,用struts2+spring+mybites写的,数据库放在webContent目录下的。.zip项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款

    集工单统计、任务钩子、权限管理、灵活配置流程与模版等工单系统

    本系统是集工单统计、任务钩子、权限管理、灵活配置流程与模版等等于一身的开源工单系统,当然也可以称之为工作流引擎。 致力于减少跨部门之间的沟通,自动任务的执行,提升工作效率与工作质量,减少不必要的工作量与人为出错率。

    Qt5.12Linux+Win安装包-压缩分卷00(共10卷)

    第00卷,密码在对应的文章内。

    Linux Mint-15.zip

    目录: linuxmint-15-cinnamon-dvd-32bit linuxmint-15-cinnamon-dvd-64bit linuxmint-15-kde-dvd-32bit linuxmint-15-kde-dvd-64bit linuxmint-15-mate-dvd-32bit linuxmint-15-mate-dvd-64bit linuxmint-15-xfce-dvd-32bit linuxmint-15-xfce-dvd-64bit 网盘文件永久链接

    chromedriver-win32-135.0.7031.0(Canary).zip

    chromedriver-win32-135.0.7031.0(Canary).zip

    STM32开发:IIR带阻滤波器设计与实现,含巴特沃斯和切比雪夫滤波器MATLAB程序,STM32开发中IIR带阻滤波器的实现与巴特沃斯滤波器设计详解:附MATLAB程序,STM32开发 IIR带阻滤

    STM32开发:IIR带阻滤波器设计与实现,含巴特沃斯和切比雪夫滤波器MATLAB程序,STM32开发中IIR带阻滤波器的实现与巴特沃斯滤波器设计详解:附MATLAB程序,STM32开发 IIR带阻滤波器 STM32实现IIR无限冲击响应带阻滤波器设计,巴特沃斯滤波器,代码工整,自编代码,注释详细,赠送巴特沃斯和切比雪夫IIR带阻滤波器MATLAB程序 ,STM32开发; IIR带阻滤波器; 无限冲击响应; 巴特沃斯滤波器; 自编代码; 注释详细; MATLAB程序,STM32中IIR带阻滤波器设计与实现

    遵循HTTP协议,编写HTML生成器生成前端界面,完成简单的博客系统.zip(课设&实训&大作业&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款

    基于ssh&acegi的简单b2c电子商务网站.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    纯电动汽车仿真研究:基于Matlab Simulink与Simscape的车辆模型动力性、经济性及续航里程分析,基于Matlab Simulink与Simscape的纯电动汽车动力、经济性及续航里程仿

    纯电动汽车仿真研究:基于Matlab Simulink与Simscape的车辆模型动力性、经济性及续航里程分析,基于Matlab Simulink与Simscape的纯电动汽车动力、经济性及续航里程仿真模型探究,纯电动汽车仿真、纯电动公交、纯电动客车、纯电动汽车动力性仿真、经济性仿真、续航里程仿真。 模型包括电机、电池、车辆模型。 有两种模型2选1: 1 完全用matlab simulink搭建的模型。 2用simscape搭建的车辆模型。 ,纯电动汽车仿真; 纯电动公交; 纯电动客车; 动力性仿真; 经济性仿真; 续航里程仿真; 模型(电机、电池、车辆模型); MATLAB Simulink模型; Simscape车辆模型。,纯电动交通工具仿真模型研究:基于Matlab Simulink与Simscape的电池、电机及车辆性能分析

    MATLAB代码:电转气P2G与碳捕集设备在热电联供综合能源系统中的优化调度模型研究:融入碳交易机制的非线性模型高效求解 ,MATLAB环境下结合P2G技术与碳捕集设备的综合能源系统优化调度模型,包括

    MATLAB代码:电转气P2G与碳捕集设备在热电联供综合能源系统中的优化调度模型研究:融入碳交易机制的非线性模型高效求解。,MATLAB环境下结合P2G技术与碳捕集设备的综合能源系统优化调度模型,包括热电联产与低碳调度,借鉴碳交易机制实现高效求解。,MATLAB代码:考虑P2G和碳捕集设备的热电联供综合能源系统优化调度模型 注意:店铺内有大量考虑碳交易代码,欢迎咨询 关键词:碳捕集 综合能源系统 电转气P2G 热电联产 低碳调度 参考文档:《Modeling and Optimization of Combined Heat and Power with Power-to-Gas and Carbon Capture System in Integrated Energy System》完美复现 仿真平台:MATLAB yalmip+gurobi 主要内容:代码主要做的是一个考虑电转气P2G和碳捕集设备的热电联供综合能源系统优化调度模型,模型耦合CHP热电联产单元、电转气单元以及碳捕集单元,并重点考虑了碳交易机制,建立了综合能源系统运行优化模型,模型为非线性模型,采用yalmip

    课程设计 二手商城 基于springboot后台管理.zip(课设&实训&大作业&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    19考试真题最近的t37.txt

    19考试真题最近的t37.txt

    (参考项目)MATLAB交通道路标识识别.zip

    MATLAB交通标志识别系统可以通过图像处理和机器学习技术来识别道路上的不同交通标志。这个系统可以通过以下步骤来实现: 1. **数据收集**:收集具有不同交通标志的图像作为训练集,可以使用公开的交通标志数据集或者自己创建一个数据集。 2. **图像预处理**:对采集到的图像进行预处理,比如去噪、调整大小、灰度化等操作,以便更好地进行特征提取。 3. **特征提取**:从预处理后的图像中提取特征,例如颜色、形状、纹理等特征,以便训练分类器。 4. **分类器训练**:使用机器学习算法(如支持向量机、人工神经网络等)对提取的特征进行训练,以建立交通标志的分类模型。 5. **标志识别**:使用训练好的分类器对新的图像进行识别,并输出识别结果。 MATLAB提供了丰富的图像处理工具箱和机器学习工具箱,可以帮助实现交通标志识别系统。可以使用MATLAB编写代码来处理图像、提取特征、训练分类器和进行识别。同时,也可以借助深度学习工具箱来构建卷积神经网络(CNN)等深度学习模型进行交通标志的识别。 需要注意的是,在实际应用中,还需要考虑系统的实时性、准确性和稳定性等因素,以确保该系统在不同场景下能够有效地识别交通标志。

    双有源桥扩展技术:100kHz高频率、最小电流应力优化的3kw功率开关控制系统,双有源桥扩展技术:100kHz高频率、375-48V宽电压范围下的3kw功率控制与优化,双有源桥扩展移相控制 开关频率

    双有源桥扩展技术:100kHz高频率、最小电流应力优化的3kw功率开关控制系统,双有源桥扩展技术:100kHz高频率、375-48V宽电压范围下的3kw功率控制与优化,双有源桥扩展移相控制 开关频率100k,375-48V,功率3kw 控制方式为最小电流应力优化控制 参数可定制 ,双有源桥;扩展移相控制;开关频率100k;功率3kw;最小电流应力优化控制;参数可定制,双桥移相控制,最小电流应力优化——100k开关频率功率控制技术

Global site tag (gtag.js) - Google Analytics