Decorator
1 意图:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更灵活。
2 别名:包装器Wrapper
3 动机:将组件嵌入到另一个对象中,由这个对象添加边框。嵌入的对象叫做装饰。装饰的接口与所装饰的组件接口一致,因此对客户透明。
由于透明,可以递归嵌套多个装饰,添加任意多的功能。
4 适用性:
. 不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
. 处理那些可以撤销的职责
. 当不能采用生成子类的方式扩充时。大量独立的扩展,为支持每一种组合将产生大量的子类。
一种情况,有大量独立的扩展,为支持每一种组合将产生大量子类,子类数目爆炸性增长。
另一种情况,因为类定义被隐藏,类定义不能生成子类。
5 参与者:
. Component 定义一个对象接口,可以给这些对象动态添加职责
. ConcreteComponent:定义一个对象,给这个对象添加一些职责
. Decrator:为之一个指向Component对象的指针,定义一个与Component接口一致的接口。
. ConcreteDecrator:向组件添加职责
6 协作:
Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。
7 效果:
优点:
1)比静态继承更灵活
2)避免在层次结构高层的类有太多的特征
3)Decorator与Component不一样
4)有许多小对象
8 实现:
1)接口的一致性
2)省略抽象的Decorator
3)保持Component类的简单性
4)改变对象外壳与改变对象内核
9 相关模式:
. Adapter只改变接口,Decorator仅改变职责
. Composite模式:可将装饰视为只有一个退化的、仅有一个组件的组合。
. Strategy改变对象的内核, Decorator改变对象的外壳
Decorator的更多相关文章
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...
- 设计模式(九)装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
- Python之美--Decorator深入详解
转自:http://www.cnblogs.com/SeasonLee/archive/2010/04/24/1719444.html 一些往事 在正式进入Decorator话题之前,请允许我讲一个小 ...
- C#设计模式系列:装饰模式(Decorator)
1. 装饰模式简介 装饰模式动态地给一个对象添加额外的职责.例如一幅画有没有画框都可以挂在墙上,画就是被装饰者.但是通常都是有画框的.在挂在墙上之前,画可以被蒙上玻璃,装到框子里,所以在画上加一层画框 ...
- 装饰模式 - Decorator 和 外观模式 - Facade
装饰模式 Decorator,不改变接口但动态给对象加入责任,所需功能按顺序串联起来控制,比生成子类灵活. 外观模式 Facade,让接口更简单.为子系统中的一组接口提供一个一致的界面. 参考:
- 设计模式学习之路——Decorator装饰模式(结构模式)
子类复子类,子类何其多 假如我们需要为游戏中开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能:比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等. 动机 ...
- angular中自定义依赖注入的方法和decorator修饰
自定义依赖注入的方法 1.factory('name',function () { return function(){ } }); 2.provider('name',function(){ thi ...
- python嵌套函数、闭包与decorator
1 一段代码的执行结果不光取决与代码中的符号,更多地是取决于代码中符号的意义,而运行时的意义是由名字空间决定的.名字空间是在运行时由python虚拟机动态维护的,但是有时候我们希望能将名字空间静态化. ...
- [工作中的设计模式]装饰模式decorator
一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...
- python 中的decorator
python 中decorator的作用就是一个包装的作用,所谓包装指在执行真正的函数之前或者之后,我们可以有一些额外的发挥余地. decorator形式如下 def dec(arg1): print ...
随机推荐
- mvc3升级mvc4的方法记录.
手工升级ASP.NET MVC 3项目: 一.安装ASP.NET MVC 4 二.升级ASP.NET MVC版本配置信息: 1:替换项目 Web.config 中的 System.Web.Mvc, V ...
- oracle拼接字符串
参考:http://www.cnblogs.com/freeliver54/archive/2013/07/01/3165144.html
- fiddler实现手机端抓包(代理)
一.fiddler设置代理 1.打开Fiddler->Tools->Fiddler Options在Connection面板里将 Allow remote computers to con ...
- 编写Java程序最容易犯的21种错误
1.duplicated code 代码重复几乎是最常见的异味了.他也是refactoring的主要目标之一.代码重复往往来自于copy-and-paste的编程风格.与他相对应oaoo是一个好系统的 ...
- Android View坐标Left, Right, Top, Bottom
Android View坐标Left, Right, Top, Bottom 1.分析说明Left, Right, Top, Bottom View中对于该字段说明如下,相对父布局的的位置 相对父布局 ...
- 0512 Scrum 4.0
看板设计 每日例会时间定于下午放学回到宿舍,地点是在宿舍外的走廊或宿舍里,特殊情况待定: 团队开会照片 任务认领: 首页设计-------王俊杰 鸡汤版面-------列志华 论“汤”版面------ ...
- paper 109 :图像处理中的拉普拉斯算子
1.基本理论 拉普拉斯算子是最简单的各向同性微分算子,具有旋转不变性.一个二维图像函数 的拉普拉斯变换是各向同性的二阶导数,定义为: 为了更适合于数字图像处理,将该方程表示为离散形式: 另外 ...
- vs extension
优先级高低
- yield return的作用
测试1: using UnityEngine; using System.Collections; public class test1 : MonoBehaviour { // Use this f ...
- myisam压缩(前缀压缩)索引
myisam使用前缀压缩来减少索引的大小,从而让更多的索引可以放入内存中,默认只压缩字符串,但通过参数配置也可以对整数做压缩,myisam压缩每个索引块的方法是,先完全保存索引块中的第一个值,然后将其 ...