目录
- 装饰模式(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的个人空间