天天看点

设计模式总结之Decorator Pattern(装饰者模式)目录 Decorator Pattern(装饰者模式)

目录

  • 设计模式分类

创建型设计模式:

  • Singleton Pattern(单例模式)   
  • Prototype Pattern(原型模式)
  • Factory Method Pattern(工厂方法模式)   
  • Abstract Factory Pattern(抽象工厂模式)
  • Builder Pattern(建造者模式)

结构型设计模式:

  • Adapter Pattern(适配器模式)   
  • Bridge Pattern(桥接模式)
  • Composite Pattern(组合模式)
  • Decorator Pattern(装饰者模式)
  • Façade Pattern(外观模式)
  • Flyweight Pattern(享元模式)
  • Proxy Pattern(代理模式)   

行为型设计模式:

  • Chain of Responsibility Pattern(职责链模式)
  • Command Pattern(命令模式)
  • Interpreter Pattern(解释器模式)   
  • Iterator Pattern(迭代器模式)
  • Mediator Pattern(中介者模式)
  • Memento Pattern(备忘录模式)
  • Observer Pattern(观察者模式)
  • State Pattern(状态模式)
  • Strategy Pattern(策略模式)
  • Template Method Pattern(模板方法模式)
  • Visitor Pattern(访问者模式)

Decorator Pattern(装饰者模式)

Decorator Pattern叫装饰模式,或装饰者模式,以前叫包装器模式(Wrapper,GoF在92-93年由Wrapper改为Decorator)。

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

Decorator模式的工作原理是:可以创建始于Decorator对象(负责新的功能的对象)终于原对象的一个对象“链”。

设计模式总结之Decorator Pattern(装饰者模式)目录 Decorator Pattern(装饰者模式)

装饰者模式隐含的是通过一条条装饰链去实现具体对象,每一条装饰链都始于一个Componet对象,每个装饰者对象后面紧跟着另一个装饰者对象,而对象链终于ConcreteComponet对象。 

意图

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

适用性

1. 需要扩展一个类的功能,或给一个类添加附加职责。

2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

结构:

设计模式总结之Decorator Pattern(装饰者模式)目录 Decorator Pattern(装饰者模式)

在装饰模式中的各个角色有:

  (1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

  (2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。

  (3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。

  (4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

例子

设计模式总结之Decorator Pattern(装饰者模式)目录 Decorator Pattern(装饰者模式)
设计模式总结之Decorator Pattern(装饰者模式)目录 Decorator Pattern(装饰者模式)
空桌子,没装饰 装饰后的桌子,有桌布,有花
设计模式总结之Decorator Pattern(装饰者模式)目录 Decorator Pattern(装饰者模式)
设计模式总结之Decorator Pattern(装饰者模式)目录 Decorator Pattern(装饰者模式)

另:

JAVA中IO流的设计就大量运用了装饰模式,如:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("..")));

继续阅读