装饰器模式的形象理解油漆工刷油漆。油漆工是装饰器角色,被刷者是被装饰器角色。
装饰器分四个角色
抽象构件角色:增加附加功能的一个抽象接口。也就是被装饰的一个抽象角色。
具体构件角色:抽象构件角色的实现类。
装饰器角色:持有抽象构件觉得一个变量引用。切也要与抽象构件角色同一接口。
具体装饰器角色:装饰器角色的实现类。具体附加功能到抽象角色。
说了这么多。。还是用实例来描述比较形象。下面一女孩子不同穿着来说明
譬如女孩子喜欢穿裙子。喜欢咋马尾辫。不同打扮。但是这个女孩子还是没有变。
//女孩接口
public interface Girl{
//女孩子逛街行为
public void goShopping();
}
//具体实现类
public class Interface GirlImpl{
public void goShopping(){
System.out.println("今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈");
}
}
//装饰器的抽象类。定义抽象的父类接口
public interface DecorationGirl extends Girl{
}
//穿LV 裙子的装饰的女孩子
public class SkirtDecorationGirl implements DecorationGirl{
//女孩子对象的引用属性
private Girl girl;
public SkirtDecorationGirl(Girl girl){
this.girl=girl;
}
private void wearSkirt(){
System.out.println("亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...");
}
public void goShopping(){
wearSkirt();
girl.goShopping();
}
}
//既穿LV裙子。又骑捷安特的自行车的女孩子。还是女孩子
public class GiantBikeGirl extends SkirtDecoration{
public GiantBikeGirl(Girl girl){
super(girl);
}
private void bikeGiant(){
System.out.println("我今天要骑你送给我的捷安特的自行车。这车好便宜啊。才5000多!");
}
public void goShopping(){
bikeGiant();
girl.goShopping();
}
}
//客户端调用
public class Client{
public static void main(String arg[]){
Girl girl = new GirlImpl();
Girl skirtGirl = new SkirtDecorationGirl (girl);
Girl giantGirl = new GiantBikeGirl(skirtGirl);
//只穿裙子的女孩子逛街
skirtGirl.goShopping();
//又穿裙子。又骑自行车的女孩子逛街
giantGirl.goShopping();
}
}
//穿裙子逛街的女孩子
亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...
今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈
//既骑车又穿裙子的逛街的女孩子
我今天要骑你送给我的捷安特的自行车。这车好便宜啊。才5000多!"
亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...
今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈
GiantBikeGirl 和SkirtDecorationGirl 可以任意组合。可以得出不同打扮的女孩子逛街。总之不管是什么穿着。都是这个女 孩子。不会改变。
应用场景:
1, 需要扩展一个类的功能或者附件责任同时也可以撤销一个类的动态的功能。
2.需要增加一些基本的功能的排列组合而产生的大量的功能时。
有点:
1,很方便的扩展一个类的功能。同时比继承更具灵活性。
2.可以排列组合装饰类产生大量的新增功能。
缺点:
由于装饰器类设计组合灵活性导致比继承更容易出错。
备注:装饰器的模式的核心就是接口要统一.基本行为还是抽象构件的行为。所以要持有被装饰角色的引用。
发表评论
-
调停者,观察者,门面模式
2011-11-15 19:38 1218调停者(Mediator)模式 ... -
访问者模式
2011-08-26 10:06 592访问者模式 -
状态模式
2011-08-26 10:06 458状态模式 -
备忘录模式
2011-08-25 16:17 746备忘录模式又叫快照模式或者Token模式 是对象的行为模式 ... -
命令模式
2011-08-25 14:40 667命令模式核心是封装命令类(请求类),每一个命令类作单独的类,分 ... -
责任链模式
2011-08-24 21:40 648责任链模式是一种行为模式。多个处理类组成一个责任链,责任链处理 ... -
模板方法模式
2011-08-24 13:35 628这个模式相对来说也比较简单。 -
策略模式
2011-08-23 16:02 638策略模式是比较常用的一种模式.封装不算法。每一个算法封装在不同 ... -
不变模式
2011-08-23 15:42 653不变模式比较简单,一般设计成一个类或者一个继承等级结构。 不 ... -
桥梁设计模式(柄体设计模式)
2011-08-22 23:51 685桥梁设计是将抽象化和实现化分离。抽象化就是指模型的抽象化,是实 ... -
适配器模式(变压器模式)
2011-08-22 21:42 862为什么要 用适配器模式。就是把两个完全不关联或者不相同的类纠合 ... -
享元模式
2011-08-18 08:53 656享元模式的角色划分: 1,抽象享元角色:享元角色需要实现的公 ... -
组合设计模式(合成模式)
2011-08-14 23:35 798组合设计模式(部分-整体设计模式) 主要角色涉及三个 抽 ...
相关推荐
装饰器模式又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 UML类图: 角色: 组件对象的接口:可以给这些...
1345整理包裹能切换模式
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,...
压缩包中包含了观察者模式,责任链模式以及包裹模式三个重要的设计模式的演示代码,是用java写的。非常适合初学设计模式的人学习,因为大多数的人学习设计模式只是停留在理论阶段,但是实际上需要自己去写出具体的...
它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 装饰者模式结构图: 装饰者模式角色: (1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。 (2)具体构件(Concrete ...
对于干涉图的相位解包裹,对matlab语言编写
二氧化硅包裹金纳米棒制备双模式光学细胞成像探针,宗慎飞,王著元,本文提出了一种新型的双模式光学细胞成像探针。该探针能提供荧光和表面增强拉曼散射(SERS)信号对细胞进行成像。该探针具有核壳�
举出一个生活中使用装饰者模式的例子,用程序实现思路 举个生活中的例子,俗话说"人在衣着马在鞍",把这就话用装饰者模式的语境翻译一下 ,"人通过漂亮的衣服装饰后,男人变帅了,女人变漂亮了;"。对应 上面的类图...
基于四向最小二乘解包裹算法,可以实现对包裹相位的相位展开
有效的解包裹程序:傅里叶变换相位解包裹程序
本文实例为大家分享了python修改装饰器中参数的具体代码,供大家参考,具体内容如下 案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 ...
有效的解包裹程序:傅里叶变换相位解包裹程序
一种通过快速傅里叶余弦变换的解包裹程序(基于Matlab)
最小二乘法解包裹相位,用peaks函数生成包裹相位图,通过最小二乘法去包裹得到去包裹后的真实相位图,显示运行时间,相关很好
最小二乘法解包裹的使用代码,包括LSunwrap.m,unwrapphase.m,wrapphase.m
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
jquery 包裹节点 节点jquery 包裹节点 节点
适合C++初学者,继承和派生,基类为包裹类,派生类有连夜和两日两种。
它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 示例: A、B、C编辑同一篇文章。 class Article{ protected $content; public function __construct($info){ $this->content = $info; } } class ...