设计模式-装饰模式(Decorator Pattern)
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)相关推荐
- 二十四种设计模式:装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern) 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert ...
- 设计模式系列之装饰模式(Decorator Pattern)
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...
- 七、装饰模式(Decorator Pattern)
一.介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:使用继承实现类的功能的扩展,有时子类会过多的问题. 应用实例: 1.一幅照片,将它放入玻 ...
- 基于东北F4的设计模式情景剧——第一幕 装饰模式(Decorator Pattern)
第一场 难题未解 布景:铁岭,晴天,午后,风.在一幢还算气派的写字楼的三层外墙上,挂着一条红色横幅,上面用歪歪扭扭的毛笔字写着"东北F4软件外包工作室".大风中,那早已褪色的条幅剧 ...
- 23装饰模式(Decorator Pattern)
子类复子类,子类何其多 假如我们需要为游戏中开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能;比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等. 按类 ...
- 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...
- 装饰模式 Decorator Pattern
java设计模式_装饰者模式(带例子) Decorator模式(装饰者) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理 ...
- 设计模式(13):结构型-装饰模式(Decorator)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- decorator java_java_详解java装饰模式(Decorator Pattern),一、装饰器模式(Decorator Patter - phpStudy...
详解java装饰模式(Decorator Pattern) 一.装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式 ...
最新文章
- springCloud Zuul网关
- mv 重命名或移动文件
- torch_geometric笔记:nn. graclus (图点分类)
- 云智一体趋势下,百度智能云打通技术与商业的共生闭环
- python将图像转换为8位单通道_使用Python将图片转换为单通道黑白图片
- python遍历树结构_python 数据结构与算法——树的遍历
- 我自己关于C语言,编译器,标准库,GUN glibc,CRT ,API之类的理解。
- 如何把一个整数转化成数组_「leetcode891」给定一个整数数组 A,考虑 A 的所有非空子序列...
- 第八章 linux磁盘与文件系统管理g
- 群晖NAS教程(十五)、利用Web Station安装typecho博客
- 4.PCIe协议分析2-PIO XAPP1052 XDMA三者联系和区别详谈
- 2345蓝月传奇服务器维护,2345蓝月传奇4月29日合服公告
- 吐血分享:QQ群霸屏技术教程2017(维护篇)
- 【笔记】element-ui el-select使用需要v-model绑定值为字符串,而选中后事件获取对象
- 自适应流媒体传输(四)——深入理解MPD
- 带买卖双方的尼日利亚进出口海关数据
- ABAP学习笔记(转自百度文库)_小七_新浪博客
- Android 8新增的img文件
- 2d手机游戏开发_我的手机游戏如何在2周内获得365K应用商店下载(以及为什么我退出独立游戏开发公司…...
- 长安链ChainMaker:一、使用自定义组织节点docker启动链
热门文章
- android 自定义分区,android 自定义预制APP分区
- adb可以连接linux设备吗,Linux通过ADB与Android设备交互
- 汇编解析(1)-内存寻址之实模型平面模式(real mode flat mode)(1)
- rust(12)-闭包,闭包作为返回值,闭包作为参数
- 【小白学习PyTorch教程】九、基于Pytorch训练第一个RNN模型
- 【讨论】拿什么来维护原创作者的权益?
- 【职场】为什么要 “打工人” ?
- 【Python】全网最新最全Pyecharts可视化教程(一)
- 融合通信常见问题3月刊 | 云信小课堂
- “彪悍的代码 不羁的创意”—— 网易云信全国高校MINI开发挑战赛战队招募启动...