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 ...
随机推荐
- mysql中取日期的一部分
DATE_FORMAT(date,format) 根据format字符串格式化date值.下列修饰符可以被用在format字符串中: %M 月名字(January……December) %W 星期名字 ...
- Netty5.x中新增和值得注意的点
最近事情多,OneCoder折腾了好几天,总算翻译完成了. 翻译自官方文档:http://netty.io/wiki/new-and-noteworthy-in-5.x.html 该文档会列出在N ...
- lua module环境探秘
module 作用 module (name [, ···]) Creates a module. If there is a table in package.loaded[name], this ...
- pptp记录日志
/etc/ppp/ip-up #!/bin/bash # This file should not be modified -- make local changes to # /etc/ppp/ip ...
- grunt安装、配置、在webstrom中使用
1.全局范围安装 Grunt命令行(CLI) npm install -g grunt-cli Grunt CLI的任务很简单:调用与Gruntfile在同一目录中 Grunt.这样带来的好处是,允许 ...
- zjuoj 3606 Lazy Salesgirl
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3606 Lazy Salesgirl Time Limit: 5 Secon ...
- JS按回车键实现登录的方法
本文实例讲述了JS按回车键实现登录的方法,该功能有着非常广泛的实用价值.分享给大家供大家参考之用.具体方法如下: 方法一: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 < ...
- 【001:ubuntu下搭建ESP8266开发环境--编辑 编译 下载】
系统环境:ubuntu 16.04 TLS 64BIT 编辑器: Eclipse CDT 版本 编译器:xtensa-lx106-elf 交叉编译工具链 下载工具:esptool.py pyseria ...
- 11. 星际争霸之php设计模式--备忘模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Cutterman 切图神器,虽然还没用过,先 mark 一下好了
在官网上找了半天也没发现下载链接,注册账号用无法激活,还是等等再试吧.