七个结构模式之装饰者模式(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代理模式与装饰者模式
静态代理和装饰者模式的区别: 先来看一下装饰者模式的定义:装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 总结一下采用装饰者模式是为了增强或拓展原对象的功能. ...
随机推荐
- Struts2中Action取得表单数据的几种方法
Struts2中Action取得表单数据的几种方法 Struts2中Action获得表单数据的几种方法struts2 Action获取表单传值 1.通过属性驱动式JSP: <form act ...
- KendoUI系列:DatePicker
1.基本使用 <link href="@Url.Content("~/C ontent/kendo/2014.1.318/kendo.common.min.css" ...
- KlayGE 4.4中渲染的改进(二):DR的其他改进
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2749 上一篇讲了TBDR的实现,本篇继续讲解deferred rendering层的一些 ...
- Netgen mesh library : nglib
Netgen mesh library : nglib eryar@163.com 摘要Abstract:本文主是对Netgen的库nglib的用法进行介绍.主要参考资料是Netgen用户指南.最后给 ...
- SharePoint Server 2013开发之旅(二):使用在线的开发人员网站进行SharePoint App开发
上一篇我已经介绍了新版本的SharePoint Server提供了四种主要的开发场景,其中一个全新的App开发模型让我们眼前一亮.这一篇我将介绍如何在线进行SharePoint App开发. 谈到Sh ...
- webstorm使用技巧
WebStorm快捷键收集:模式visual studio 代码提示:ctrl + alt + 空格 代码补全:alt + / 代码换行:ctrl + shift + 上下箭头 重新运行:ctrl + ...
- 邻接表无向图(二)之 C++详解
本章是通过C++实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywa ...
- JavaWeb:Web与HTTP协议简介
JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...
- 轻松自动化---selenium-webdriver(python) (二)
本节知识点: 打印URL 将浏览器最大化 设置浏览器固定宽.高 操控浏览器前进.后退 打印URL 上一节讲到,可以将浏览器的title打印出来,这里再讲个简单的,把当前URL打印出来.其实也没啥大用, ...
- Hadoop入门学习笔记---part1
随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...