七个结构模式之装饰者模式(Decorator Pattern)
定义:
使用组合的方法,动态给一个类增加一些额外的功能,避免因为使用子类继承而导致类继承结构复杂。并且可以保持和被装饰者同一个抽象接口,从而使客户端透明。
结构图:

- Component:抽象构件类,定义了具体构件和装饰者的共同父类,定义了构件中需要被实现的业务方法。其引入向客户端屏蔽了实现细节,可以统一地处理伪装是之前的具体构件和装饰者类。
- ConcreteComponent:具体构件类,实现了抽象构件类中定义的业务方法。一般其方法都是比较简单,可以在装饰者中进一步修饰和增加职能。
- Decorator:抽象装饰者类,持有了一个抽象构件类对象的引用,并且定义了抽象构建类对象的注入方法,同样在实现抽象构建类定义的业务方法时,但只是简单地调用了成员变量的方法。具体职能的增加,放入到子类中。
- ConcreteDecorator:具体装饰者类,继承了抽象继承类,并重写了其业务方法,在业务方法中加入了新的职能。
透明和半透明模式
在一些情况下装饰类中新添加的功能方法与原有的业务方法相互独立,而且客户端希望可以直接调用,因此就有两种模式。
- 透明模式:
装饰模式的标准模式,客户端完全针对抽象层编程,不应该将对象声明为具体构件类或具体装饰类,这两者没有任何区别。并且透明模式允许对象可以被多次装饰使用,来实现更复杂的功能。但透明模式并不能直接访问装饰类新增的功能。 - 半透明模式:
半透明模式中,客户端可以不用关心具体的构件,但是需要声明具体的装饰类。半透明模式增加了系统的灵活性,但是不能对对象进行多次修饰,并且需要对两种不同的构件进行区别对待。
装饰者模式与桥接模式的区别
- 桥接模式包含两个独立变化的维度,并且只在抽象层利用组合建立了桥接关系。
- 装饰者模式包含的两个维度相互依赖,装饰者所在的维度一般要依赖于具体抽象构件类的维度。并且不仅利用组合建立了连接关系,同时两个维度还同时继承了同一个抽象构建类。
注意:
- 尽量保持装饰者类与被装饰者类接口一致,从而使客户端可以透明地使用,并利用配置文件等可以灵活地扩展。
- 尽量保持被装饰者类是一个轻类,不用把太多的行为放在装饰者类中,我们可以通过装饰者类对其进行扩展。
- 如果只有一个具体构件类,可以直接让装饰者类继承该构建类。如图:

优点:
- 可以动态地为类添加功能,并且不会导致类的个数急剧增加。
- 可以对一个对象多次装饰,使用不同的装饰类进行组合可以实现复杂的功能。
- 具体构件和装饰类可以独立变化,方便扩展,符合开闭原则。
适用场景:
- 在不影响其它类的情况下,动态、透明地给单个对象增加职责。
实例:

七个结构模式之装饰者模式(Decorator Pattern)的更多相关文章
- Java进阶篇设计模式之五-----外观模式和装饰器模式
前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...
- Java设计模式之五 ----- 外观模式和装饰器模式
前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...
- 涉及模式之 装饰器模式详解(与IO不解的情缘)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. LZ到目前已经写了九个设计模 ...
- 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现
课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...
- IOS设计模式之二(门面模式,装饰器模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- Java中设计模式之装饰者模式-3
装饰者模式: 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 装饰者核心:实现功能组合 继承与组合区别: 继承 继承是给一个类添加行为的比较有效的途径.通过使用继承, ...
- 聊聊模板方法模式,装饰器模式以及AOP
在软件系统设计的时候,我们需要把一个大的系统按照业务功能进行拆分,做到高内聚.低耦合. 但是呢,拆分之后会产生一些通用性的东西,比如日志,安全,事务,性能统计等,这些非功能性需求,横跨多个模块.最lo ...
- javascript设计模式----桥接模式、组合模式、装饰者模式、享元模式
http://blog.csdn.net/painsonline/article/details/7215087 桥接模式:http://www.cnblogs.com/TomXu/archiv ...
- java代理模式与装饰者模式
静态代理和装饰者模式的区别: 先来看一下装饰者模式的定义:装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 总结一下采用装饰者模式是为了增强或拓展原对象的功能. ...
随机推荐
- Node学习
参见Node入门 做出node应用的第一个例子 图片上传浏览.
- Objective-C中@property的所有属性详解
1,assign : 简单赋值,不更改索引计数 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a 和b指 ...
- Jetty集群配置Session存储到MySQL、MongoDB
在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录.购物车等. Se ...
- Ext.grid.CheckboxSelectionModel状态设置
直接上代码: var model = grid.getSelectionModel(); model.selectAll();//选择所有行 model.selectFirstRow();//选择第一 ...
- prototype.js源码
prototype 1.3.1 版本和之前的 1.2.0 版本有了不少改进,并增加了新的功能: 1. 增加了事件注册管理2. 增加了空间定位的常用函数3. 改善了 xmlhttp 的封装4. 移除了 ...
- [git]撤销的相关命令:reset、revert、checkout
基本概念 工作区 暂存区 本地版本仓库 远程版本仓库 如果不清晰上面的四个概念,请查看廖老师的git教程 这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我 ...
- QT学习笔记4
顶层窗口-MainWindow 新建项目,选择基类的时Base Class是QMainWindow 最上面是Window Title,用于显示标题和控制按钮,比如最大化.最小化和关闭等:下面一些是Me ...
- 第16/24周 SQL Server 2014中的基数计算
大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...
- JavaScript之旅(DOM)
JavaScript之旅(DOM) [TOC] 一.认识DOM 什么是 DOM? DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准 ...
- 大话PHP缓存头
304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了. 我们自己在nginx上放一个文件,test.png.可以使用下面的地 ...