目的
动态的给一个对象添加一些额外的职责。它使用客户端透明的方式来扩展对象功能,并且该模式要比继承更为灵活。
适用范围
- 以动态透明的方式来给单个对象添加职责。
- 处理可以撤销的职责。
不能采用生成子类的情况进行扩充。其一是有大量的扩展,为了支持每种组合需要产生大量的子类,使子类数目呈现爆炸性增长。其二是类的定义被隐藏或者不能用来生成子类。
涉及组件
- 抽象组件:定义一个抽象的接口,规范准备附加的类。
- 具体组件:将要被附加功能的类,它实现抽象的接口。
- 抽象装饰者:持有对具体构建角色的引用并且定义与抽象构建角色一致的接口。
具体装饰:实现抽象装饰者角色,负责对具体构建添加额外功能。
类图
代码
Component
public interface Person{ void say(); }
ConcreteComponent
public class Man implements Person{ public void say(){ System.out.println("hello,"); } }
Decorator
public abstract class Decorator implements Person{ protected Person person; public void setPerson(Person person){ this.person = person; } public void say(){ person.say(); } }
ConcreteDecorator
public class menDecoratorA extends Decorator{ public void say(){ super.say(); reSay(); System.out.println("menDecoratorA类"); } public void reSay(){ System.out.println("Nice to meet you!"); } } public class menDecoratorB extends Decorator{ public void say(){ super.say(); System.out.println("How are you"); System.out.println("menDecoratorB类"); } }
Test
public class Main{ public static void main(String args[]){ Man man = new Man(); menDecoratorA md1 = new menDecoratorA(); menDecoratorB md2 = new menDecoratorB(); md1.setPerson(man); md2.setPerson(md1); md2.say(); } }
小结
- 装饰者模式可以动态的将职责附加到对象身上。它提供了有别于类继承的另外一种灵活的扩展方式。
- 它在不修改原代码的情况下允许对象的行为被扩展。
- 它意味着一群包装具体组件的装饰者类。
- 装饰者模式可以在类的前边或者后边加上新的行为,甚至可以将类完全取代。
- 可以有多个装饰者对一个类进行装饰。
- 装饰者对组件的客户是透明的,除非客户程序依赖于具体的组件类型。