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

装饰者模式的关键点
装饰者与被装饰者必须是一样的类型,即他们有同样的超类型。
ConcreteComponentA想要装饰ConcreteComponentB及其子类,ConcreteComponentA中必须有一个ConcreteComponentB的引用,而ConcreteComponentB及其子类都是Component的实现类,因此,ConcreteComponentA中只需要引用Component即可。如果仅从这个程度上来说,完全是策略模式的模型,见下图:

但仅仅通过上图的类结构(也就是策略模式)我们无法完成装饰的目的。因为ConcreteComponentA必须拥有和ConcreteComponentB一样的行为,才能在调用ConcreteComponentB的doSometing()方法时,增加一些额外的职业或者提供更强大的功能,或者完全覆盖掉ConcreteComponentB的doSometing()的行为。因此我们的ConcreteComponentA也必须实现Component接口。也就是说ConcreteComponentA除了拥有一个Component的引用之外,自己还要实现Component接口。ConcreteComponentA除了拥有Component的引用外,ConcreteComponentA也可以再次被Component的其他实现类装饰,也就是说他有可能成为ConcreteComponentC中Component引用的实现,因此ConcreteComponentA实现Component接口也是必须的。
装饰者该做的事情就是增加行为(或者修改或者覆盖——这些通过该模式可以实现,但不是装饰者模式的意图)到被包装对象上。不要企图窥视装饰者链中的每一个装饰者,虽然可以实现。
你可以用无数个装饰者包装一个组件。装饰者对Client来说是透明的,除非Client依赖于Component的具体类型,但这样做就无法适应变化了。装饰者模式可以动态的装饰任何对象,因为他们通过组合Component来完成装饰的,而不是通过继承。装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂。
参考资料:
Head First 设计模式 (中国电力出版社)

- 大小: 29.1 KB

- 大小: 21.5 KB
分享到:
相关推荐
技术运维-机房巡检表及巡检说明
第四次算法分析与设计整理
图像处理项目实战
该资源为jaxlib-0.4.18-cp311-cp311-macosx_11_0_arm64.whl,欢迎下载使用哦!
搭建说明. 运行环境 php5.6 mysql5.6 扩展sg11 前置条件: 前后端分离,需要准备两个域名,一个后台域名,一个前端域名 后端源码修改(cs2.ijiuwu.com批量替换改为你的后端域名)数据库修改(cs3.ijiuwu.com批量替换为你的前端域名)1、创建后台站点,上传后台源码并解压到根目录2、创建前端站点,上传前端源码并解压到根目录 3、创建数据库上传并导入数据库文件 4、修改数据库信息: 后台:app/database.php 前端:application/database.php 前端站点设置 伪静态thinkphp 运行目录public 关闭防跨站 访问后台域名/admin.php进入后台管理 admin 123456 系统-》系统设置-》附件设置-》Web服务器URL 改为你的前端域名 系统-》清前台缓存 改为你的前端域名 点击刷新缓存
【毕业答辩】爆款黑板风教育文艺毕业论文答辩通用模板.pptx
1、文件内容:systemd-devel-219-78.el7_9.9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/systemd-devel-219-78.el7_9.9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
win32汇编环境,对 WM-MOUSEMOVE 消息的理解
车牌识别项目
UE项目开发过程中的一些快捷脚本
lab1的words.txt文件
python、yolo、pytorch
人工智能、大语言模型相关学习资料
图像处理项目实战
python、yolo、pytorch
车牌识别项目
该资源为jaxlib-0.4.18-cp312-cp312-macosx_10_14_x86_64.whl,欢迎下载使用哦!
python、yolo、pytorch
Swift-IOS TODO_List应用开发
图像处理项目实战