装饰模式

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。【DP】

图1 装饰模式类图

Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator是装饰抽象类,继承Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。【DPE】

可以通过在构造ConcreteDecorator对象或调用setComponent类似的函数来传入对ConcreteComponent具体对象的引用,以此来对ConcreteComponent具体对象进行封装。每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中【DPE】。

笔者见过的关于装饰模式的解说举例大多都是应用在程序外观方面,因此就存在一个“对象链”,这种实现是将ConcreteDecorator这些具体的装饰对象“串联”起来,它们都同时作用于ConcreteComponent具体对象。但其实还有另外一种应用,可将ConcreteDecorator这些具体的装饰对象“并联”起来,只在需要某个功能时才调用具体的装饰来作用于ConcreteComponent具体对象,这种模式可能应用到逻辑处理方面比较合适。

对于一些观点认为,如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类(如图2所示)。笔者并不认同该观点,正如Scott Meyers所言,对于继承,子类与父类的关系必须满足"is-a"的关系,而"Decorator is a ConcreteComponent"的关系很大程度上是不成立的。所以笔者认为Component抽象类的存在还是很必要的(如图3所示)。然而,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,可以把Decorator和ConcreteDecorator的责任合并成一个类。

图2 人着装类图1

图3 人着装类图2

总之,装饰模式是为已有功能动态地添加更多功能的 一种方式。其优点是把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑(“串联”时)。装饰模式也有其缺点,在进行系统设计上往往会产生许多看上去类似的小对象,使得这个系统难以被理解,排错难度也增加。

对于装饰模式的一些优缺点及其注意事项建议参考《设计模式》(P117)一书。

转载于:https://www.cnblogs.com/skycn/archive/2011/08/27/2153950.html

六 装饰模式(Decorator)——设计模式学习笔记相关推荐

  1. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  2. java设计模式学习笔记之装饰模式

    java设计模式学习笔记之装饰模式 尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697 这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧& ...

  3. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  4. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  5. 设计模式学习笔记(目录篇)

    设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三 ...

  6. 步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)

    园子里讲设计模式的太多了,最近我也在学设计模式,把我自己练的一些代码整理下,写个.NET设计模式学习笔记来让自己在设计模式的功底更深一层. 记得金庸小说里风清扬教令狐冲的时候,说过独孤九剑的总纲,无招 ...

  7. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  8. 设计模式学习笔记(C++实现)(九)--组合模式

    1.组合模式简介 英文名称 Composite 主要目的 该模式将对象组合成树形结构已表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 使用场景 1.当 ...

  9. 设计模式学习笔记(C++实现)(七)--适配器模式

    1.适配器模式简介 英文名称 Adapter 主要目的 该模式可以将一个类的的接口,转换成客户想要的另一个接口. 使用场景 1.当要使用的两个类功能相同或者相似,但仅仅是接口不同时. 2.适配器模式代 ...

  10. 设计模式学习笔记--享元(Flyweight)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

最新文章

  1. 认清Hadoop和Spark的这几点区别,学习时才能事半功倍
  2. python装饰器函数-python函数装饰器
  3. go.sum中特殊hash如何计算
  4. jemalloc/jemalloc.h: No such file or directory
  5. web安全深度剖析知识点总结
  6. Qt面试题(一)Qt信号槽第五个参数
  7. c++ static静态变量、静态函数
  8. eclipse里安装SVN插件的两种方式
  9. Servlet中上传下载模板代码
  10. Java大数开根号板子
  11. IT-RS-IPV6-EUI-64
  12. 苹果电脑mysql安装流程_mac系统下安装mysql步骤
  13. Cadence 16.6基本操作技巧
  14. springboot @Value取不到值
  15. 《C++ Primer Plus》(第6版)第3章编程练习
  16. Python3 通过 suds 访问 webservice
  17. 关于KV存储的一些总结更新中
  18. ccpc 2016 合肥站 (5道题)
  19. [Journal]有一种感动叫ACM——记WJMZBMR在成都赛区开幕式上的讲话
  20. 在tkinter当中定制icon图标

热门文章

  1. python就业前景-Python就业前景分析
  2. 编程语言python特点-Python编程语言的优点
  3. python填写excel-Python|读、写Excel文件(三种模块三种方式)
  4. python代码格式-Python 代码格式
  5. 中国python之父是谁-Python之父:谈Python
  6. python和java一样吗-Python和Java的区别
  7. pythonexe32位-如何使用pyinstaller打包32位的exe
  8. 用python画简单房子-python绘图作业:使用pygame库画房子
  9. python下载安装教程3.8.1-Linux安装Python 3.8.1
  10. Jetson Nano and VIM3硬件参数对比及目标检测性能对比