首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式学习笔记——装饰模式

2012-11-21 
设计模式学习笔记——装饰模式?Decorator 装饰模式又被称为包裹模式Wrap●以对客户透明的方式动态给一个对象

设计模式学习笔记——装饰模式

?

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部分中存在大量适配器模式和装饰模式

热点排行