Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)

装饰模式有四个角色:
1.Component抽象构件
Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对
象。
2.ConcreteComponent 具体构件
ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是
它。
3.Decorator装饰角色
一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方
法呀,在它的属性里必然有一个private变量指向Component抽象构件。
4.具体装饰角色
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最
原始的、最基本的东西装饰成其他东西。

具体请看例子:
Car

/*** @author shuliangzhao* @Title: Car* @ProjectName design-parent* @Description: TODO* @date 2019/6/13 23:26*/
public abstract class Car {public abstract void driver();
}

AudiCar

/*** @author shuliangzhao* @Title: AudiCar* @ProjectName design-parent* @Description: TODO* @date 2019/6/13 23:27*/
public class AudiCar extends Car {@Overridepublic void driver() {System.out.println("速度为每小时50KM");}
}

DecoratorCar

/*** @author shuliangzhao* @Title: DecoratorCar* @ProjectName design-parent* @Description: TODO* @date 2019/6/13 23:28*/
public abstract class DecoratorCar extends Car{private Car car;public DecoratorCar(Car car) {this.car = car;}@Overridepublic void driver() {car.driver();}
}

BlueAudiCar

/*** @author shuliangzhao* @Title: BlueAudiCar* @ProjectName design-parent* @Description: TODO* @date 2019/6/13 23:31*/
public class BlueAudiCar extends DecoratorCar {public BlueAudiCar(Car car) {super(car);}@Overridepublic void driver() {this.color();super.driver();}private void color() {System.out.println("蓝色奥迪车");}
}
/*** @author shuliangzhao* @Title: BmwCar* @ProjectName design-parent* @Description: TODO* @date 2019/6/13 23:30*/
public class RedAudiCar extends DecoratorCar {public RedAudiCar(Car car) {super(car);}@Overridepublic void driver() {this.color();super.driver();}private void color() {System.out.println("红色奥迪车");}
}

客户端

/*** @author shuliangzhao* @Title: Client* @ProjectName design-parent* @Description: TODO* @date 2019/6/13 23:32*/
public class Client {public static void main(String[] args) {Car car = new AudiCar();car.driver();Car redCar = new RedAudiCar(car) ;redCar.driver();Car blueCar = new BlueAudiCar(car);blueCar.driver();}
}

运行结果

image.png

装饰模式优点:

1.装饰类和被装饰类可以独立发展,而不会相互耦合。
2.装饰模式是继承关系的一个替代方案。
3.可以动态扩展类。

装饰模式缺点:

多层的装饰是比较复杂。

装饰模式使用场景:

需要动态地给一个对象增加功能、需要扩展一个类的功能。

举个简单例子可以看出装饰模式的好处:三个继承关系Father、Son、GrandSon三个类,我要在Son类上增强一些功能怎么办?我想你会坚决地顶回去!不允许,对了,为什么呢?你增强的功能是修改Son类中的方法吗?增加方法吗?对GrandSon的影响呢?特别是GrandSon有多个的情况,你会怎么办?这个评估的工作量就够你受的,所以这是不允许的,那还是要解决问题的呀,怎么办?通过建立SonDecorator类来修饰Son,相当于创建了一个新的类,这个对原有程序没有变更,通过扩展很好地完成了这次变更。

注意:继承是静态地给类增加功能,而装饰模式则是动态地增加功能。

设计模式-装饰模式(Decorator Pattern)相关推荐

  1. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert ...

  2. 设计模式系列之装饰模式(Decorator Pattern)

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...

  3. 七、装饰模式(Decorator Pattern)

    一.介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:使用继承实现类的功能的扩展,有时子类会过多的问题. 应用实例: 1.一幅照片,将它放入玻 ...

  4. 基于东北F4的设计模式情景剧——第一幕 装饰模式(Decorator Pattern)

    第一场 难题未解 布景:铁岭,晴天,午后,风.在一幢还算气派的写字楼的三层外墙上,挂着一条红色横幅,上面用歪歪扭扭的毛笔字写着"东北F4软件外包工作室".大风中,那早已褪色的条幅剧 ...

  5. 23装饰模式(Decorator Pattern)

    子类复子类,子类何其多 假如我们需要为游戏中开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能;比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等. 按类 ...

  6. 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream

    该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...

  7. 装饰模式 Decorator Pattern

    java设计模式_装饰者模式(带例子) Decorator模式(装饰者)    Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理 ...

  8. 设计模式(13):结构型-装饰模式(Decorator)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  9. decorator java_java_详解java装饰模式(Decorator Pattern),一、装饰器模式(Decorator Patter - phpStudy...

    详解java装饰模式(Decorator Pattern) 一.装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式 ...

最新文章

  1. springCloud Zuul网关
  2. mv 重命名或移动文件
  3. torch_geometric笔记:nn. graclus (图点分类)
  4. 云智一体趋势下,百度智能云打通技术与商业的共生闭环
  5. python将图像转换为8位单通道_使用Python将图片转换为单通道黑白图片
  6. python遍历树结构_python 数据结构与算法——树的遍历
  7. 我自己关于C语言,编译器,标准库,GUN glibc,CRT ,API之类的理解。
  8. 如何把一个整数转化成数组_「leetcode891」给定一个整数数组 A,考虑 A 的所有非空子序列...
  9. 第八章 linux磁盘与文件系统管理g
  10. 群晖NAS教程(十五)、利用Web Station安装typecho博客
  11. 4.PCIe协议分析2-PIO XAPP1052 XDMA三者联系和区别详谈
  12. 2345蓝月传奇服务器维护,2345蓝月传奇4月29日合服公告
  13. 吐血分享:QQ群霸屏技术教程2017(维护篇)
  14. 【笔记】element-ui el-select使用需要v-model绑定值为字符串,而选中后事件获取对象
  15. 自适应流媒体传输(四)——深入理解MPD
  16. 带买卖双方的尼日利亚进出口海关数据
  17. ABAP学习笔记(转自百度文库)_小七_新浪博客
  18. Android 8新增的img文件
  19. 2d手机游戏开发_我的手机游戏如何在2周内获得365K应用商店下载(以及为什么我退出独立游戏开发公司…...
  20. 长安链ChainMaker:一、使用自定义组织节点docker启动链

热门文章

  1. android 自定义分区,android 自定义预制APP分区
  2. adb可以连接linux设备吗,Linux通过ADB与Android设备交互
  3. 汇编解析(1)-内存寻址之实模型平面模式(real mode flat mode)(1)
  4. rust(12)-闭包,闭包作为返回值,闭包作为参数
  5. 【小白学习PyTorch教程】九、基于Pytorch训练第一个RNN模型
  6. 【讨论】拿什么来维护原创作者的权益?
  7. 【职场】为什么要 “打工人” ?
  8. 【Python】全网最新最全Pyecharts可视化教程(一)
  9. 融合通信常见问题3月刊 | 云信小课堂
  10. “彪悍的代码 不羁的创意”—— 网易云信全国高校MINI开发挑战赛战队招募启动...