Decorator 装饰模式
又被称为包裹模式Wrap
●以对客户透明的方式动态给一个对象附加更多的责任,客户端不会感觉装饰前后对象有何不同。
●装饰模式可以在不使用创造更多子类的情狂下,将对象的功能加以扩展。
装饰模式的对象图是呈链状结构的
比较懒 依旧盗版过来一张类图:
下面是代码,来看看他们都是如何构建的:
首先是Component 他是一个抽象接口,以规范准备接受附加责任的对象
public interface Component {
void sampleOperation();
}
之后是ConcreteComponent 这是具体构件角色,定义了一个将要接受附加责任的类
public class ConcreteComponent implements Component{
public ConcreteComponent(){
}
public void sampleOperation(){
System.out.println("ConcreteComponent Operation");
}
}
关键的Decorator角色 他持有一个Component对象的实例,并定义一个于抽象构件接口一致的接口
public class Decorator implements Component{
private Component component;
public Decorator(Component component){
this.component=component;
}
public void sampleOperation(){
component.sampleOperation();
}
}
最后当然是具体的装饰部分了 负责给构建添加各自的附加责任 这里只其中一个addOperate
public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component){
super(component);
}
public void sampleOperation(){
addOperation();
super.sampleOperation();
}
private void addOperation(){
System.out.println("addOperation");
}
}
最后的结果:
public class DecoratorDesignPattern {
public static void main(String[] args){
Component component = new ConcreteComponent();
component.sampleOperation();
Component component2 = new ConcreteDecorator(component);
component2.sampleOperation();
}
}
输出:
ConcreteComponent Operation
addOperation
ConcreteComponent Operation
很明显component2仍然是Component对象 所以可以无限的嵌套。。。
使用装饰模式的情况:
1 需要扩展一个类的功能,或者给一个类增加附加责任
2 需要动态地给一个对象增加功能,这些功能可以再动态地撤销
3 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实
装饰模式的优缺点:
1 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供更多的灵活性
2 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合
3 装饰模式比继承更加容易出错
4 装饰模式相比继承产生较少的类,但同时生成更多的对象 并且这些对象看上去都比较相似
简化装饰模式
1 装饰类接口必须与被装饰类接口相容(ConcreteDecorator类必须继承自同一父类Component)
2 尽量保持Conponent作为一个“轻”类(可以是接口 也可以是抽象类 具体类)
3 若没有Component抽象类 只有ConcreteConponent 则Decorator类通常可以是其子类
4 若ConcreteDecorator类数目比较多,就有使用一个单独Decorator类来区分抽象和具体职责的必要,肉则可以将Decorator和ConcreteDecorator合并
注意,应该声明的是一个Component类型的变量(对客户端是透明的 看起来完全一样 而不是具体的ConcreteComponent)
大多数情况是半透明的装饰模式 介于装饰模式和适配器之间
装饰模式与其他模式的对比
装饰模式和适配器模式
装饰模式——保持端口,增强所考虑对象的性能
适配器模式——改变所考虑对象的接口,而不一定改变对象的性能
装饰模式和策略模式
装饰模式——表皮换掉,保持内心 要求Component尽量轻
策略模式——保持接口不变,使具体算法可以互换 抽象策略类尽量重
装饰模式和合成模式
装饰模式常常用于合成模式的行为扩展上,是集成的替代方案。
Java中的IO部分中存在大量适配器模式和装饰模式
- 大小: 40.5 KB
分享到:
相关推荐
Solidworks学习笔记——随形变化.docxSolidworks学习笔记——随形变化.docxSolidworks学习笔记——随形变化.docxSolidworks学习笔记——随形变化.docxSolidworks学习笔记——随形变化.docxSolidworks学习笔记——...
Oracle学习笔记——day02 学习的好东西 Oracle学习笔记——day02
Cocos2d-x学习笔记——完全掌握C++ API与游戏项目开发.zip
Oracle学习笔记——day04 学习的好东西 Oracle学习笔记——day04
Oracle学习笔记——day05 学习的好东西 Oracle学习笔记——day05
Oracle学习笔记——day03 学习的好东西 Oracle学习笔记——day03
Oracle学习笔记——day01 学习的好东西Oracle学习笔记——day01
RRT学习笔记——记录
Android学习笔记——获取网络图片并显示
python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf ...
jBPM-jPDL学习笔记——流程设计与控制
Go 学习笔记——雨痕,pdf文字版带书签。在不侵犯作者个人权利的前提下,可自由散播本书。
Python学习笔记——运算符 运算符: 赋值运算符 算术运算符 关系运算符 逻辑运算符 位运算
C语言学习笔记——小浪神
——————————————————————————————————————————————
ArcGIS客户端开发学习笔记——XML学习
A星算法学习笔记——记录
Python学习笔记——对象和类
Python学习笔记——输入input(),input()使用,两个练习。