Decorator(装饰)–对象结构型模式

一、意图
1.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

二、动机
1.在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
2.如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能 扩展变化”所导致的影响将为最低?

三、适用性
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤销的职责。
3.打给你不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

四、结构

五、效果
1.比静态继承更灵活。
2.避免在层次结构高层的类有太多的特征。
3.Decorator与Component不一样。
4.有许多小对象。

六、实现
1.接口的一致性。
2.省略抽象的Decorator类。
3.保持Component类的简单性
4.改变对象外壳(Decorator)与改变对象内核(Strategy)

七、要点总结
1.通过采用组合而非继承的手法,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
2.Decorator类在接口上表现为is-a Component的继承关系,即 Decorator类继承了Component类所具有的接口。但在实现上又 表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。
3.Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。

八、相关模式
Adapter模式:Decorator模式不同于Adapter模式,因为装饰仅改变对象的职责而不该变它的接口;而适配器将给对象一个全新的接口。
Component模式:可以将装饰视为一个退化的、仅有一个组件的组合。然而,装饰仅给对象添加一些额外的职责——它的目的不在于对象聚集。
Strategy模式:用一个装饰你可以改变对象的外表;而Strategy模式使得不可以改变对象的内核。这是改变对象的两种途径。

九、举例说明
装饰模式功能名字很能解释它的行为,比如给手机贴膜,也可以给手机加个外壳,也可以随时换模,添加和减少功能很方便等等。

本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解

Decorator(装饰)--对象结构型模式相关推荐

  1. 设计模式09: Decorator 装饰模式(结构型模式)

    Decorator 装饰模式(结构型模式) 子类复子类,子类何其多 加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路 ...

  2. Composite(组合)--对象结构型模式

    Composite(组合)–对象结构型模式 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.动机 ...

  3. 设计模式十三:proxy(代理)——对象结构型模式

    proxy(代理)--对象结构型模式 1.意图 为其他对象提供一种代理以控制这个对象的访问 2.动机 对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化. 3.适 ...

  4. Proxy(代理)--对象结构型模式

    Proxy(代理)–对象结构型模式 一.意图 为其他对象提供一种代理以控制对这个对象的访问. 二.动机 1.在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或 ...

  5. Adapter(适配器)--类对象结构型模式

    Adapter(适配器)–类对象结构型模式 一.意图 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本接口不兼容而不能一起工作的那些类可以一起工作. 二.动机 1.在软件系统中, ...

  6. 设计模式七:Adapter(适配器)——类对象结构型模式

    结构型模式: 结构型模式设计到如何组织类和对象以获得更大的结构. 结构型类模式: 采用继承机制来组合接口或实现.简单的例子是采用多重继承,这一模式尤其有助于多个独立开发的类库协同工作. 结构型对象模式 ...

  7. Flyweight(享元)--对象结构型模式

    Flyweight(享元)–对象结构型模式 一.意图 运行共享技术有效地支持大量细粒度的对象. 二.动机 1.在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行 ...

  8. Facade(外观)--对象结构型模式

    Facade(外观)–对象结构型模式 一.意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.动机 1.上述左边方案的问题在于组 ...

  9. 装饰模式(Decorator Pattern)--------结构型模式

    装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为.装饰模式降低类系统的耦合度,可以动态地增加或删除对象的职责,并使得需要装饰的具体构件类和具体装饰类可以独立变化,以便增加新的具体构件 ...

最新文章

  1. Atitit 图像处理类库安装与安装模式的前世今生与未来大趋势attilax总结.docx
  2. Exchange Server 2010 全新部署篇八:CASHUB中集线器配置部分
  3. c++删除容器中的奇数
  4. github不用输入用户密码即可登录
  5. 【学习笔记】供应链金融简介(精华)
  6. 这难道不是.NET5的bug? 在线求锤?
  7. STM32F412应用开发笔记之一:初识NUCLEO-F412ZG
  8. Flutter APP UI Components
  9. java scanner构造函数_Point类的构造函数(JAVA)
  10. C语言判断逆反素数,判断素数的几种方法思考[C语言]
  11. ZZULIOJ/python1006: 求等差数列的和
  12. 项目管理里面的十大知识领域
  13. 通过2048学习自定义view(一)
  14. CollapsingToolbarLayout用法详解(简洁易懂)
  15. Excel学习笔记之基础篇
  16. STM8S103调试PWM的踩坑过程
  17. ios服务器管理系统,ios app云服务器
  18. 解决iPhone无法连接iTunes
  19. libvlc_media_add_option 函数中的参数设置
  20. Android ListView 拖拽处理

热门文章

  1. C语言之反序数组和求最大值和最小值
  2. Android之集成友盟推送功能
  3. python面向对象设计管理系统_python面向对象之单例设计模型
  4. java metrics 简书_Spring Boot Metrics
  5. resque java_php-resque :基于Redis的后台任务系统
  6. 重磅公开!36个高考数学破题大招
  7. 这可能是这次疫情最搞笑的事情,可看着看着却鼻酸了
  8. 内核中根据inode得到文件名_聊聊DOS操作系统中的文件系统FAT12
  9. python安装beautifulsoup失败_Win10环境下python36安装BeautifulSoup出现错误的解决办法
  10. pixel android8,谷歌Pixel 2更多信息:安卓8.1