目录
- 装饰模式(Decorator)
- 适用场景
- 装饰模式实例代码(Java)
 
装饰模式(Decorator)
动态地给一个对象添加一些额外的职责。就增加功能而言,装饰模式 (Decorator) 比生成子类更加灵活。
适用场景
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
- 处理那些可以撤销的职责。
- 当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。

 ✦ Component 定义一个对象接口,可以给这些对象动态地添加职责。
 ✦ ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。
 ✦ Decorator 维持一个指向 Component 对象的指针,并定义一个与 Component 接口一致的接口。
 ✦ ConcreteDecorator 向组件添加职责。
装饰模式实例代码(Java)
//对应Component
abstract class Person {
    protected String name;
    public abstract void Operation(); // 职责
}
//对应ConcreteComponent
class Student extends Person {
    public Student(String name) {
        this.name = name;
    }
    @Override
    public void Operation() {
        System.out.print(name + "的职责:学习 ");
    }
}
abstract class Decorator extends Person {
    //Decorator维持一个指向Component对象的指针
    protected Person person;
}
//对应ConcreteDecorator
class DecoratorA extends Decorator {
    public DecoratorA(Person person) {
        this.person = person;
    }
    @Override
    public void Operation() { // 职责
        person.Operation(); // 原本的职责
        System.out.print("写作业 ");
    }
}
//对应ConcreteDecorator
class DecoratorB extends Decorator {
    public DecoratorB(Person person) {
        this.person = person;
    }
    @Override
    public void Operation() { // 职责
        person.Operation(); // 原本的职责
        System.out.print("考试 ");
    }
}
public class DecoratorMain {
    public static void main(String[] args) {
        Person zhangsan = new Student("zhangsan");
        zhangsan = new DecoratorA(zhangsan);
        zhangsan = new DecoratorB(zhangsan);
        zhangsan.Operation();
        System.out.println("\n=====我是分割线=====");
        // 对象链,一次性将职责添加完
        Person lisi = new DecoratorB(new DecoratorA(new Student("lisi")));
        lisi.Operation();
    }
}
其他设计模式详见本专栏其他博文~
 特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
 zst_2001的个人空间



















