1. 类图
- Component:组件对象的接口,可以给这些对象动态地添加职责
- ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,可以给这个对象添加职责
- Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致,并持有一个Component对象,即被装饰的对象
2. 示例
动态地给一个对象添加一些额外的职责
2.1 组件接口
public interface Person {
void eat();
}
2.2 组件实现类
public class Student implements Person {
@Override
public void eat() {
System.out.println("学生吃饭");
}
}
2.3 装饰器父类
public abstract class Decorator implements Person {
private Person person;
public Decorator(Person person){this.person = person;}
@Override
public void eat() {
person.eat();
}
}
2.4 装饰器实现类
public class StudentDecoratorA extends Decorator {
public StudentDecoratorA(Person person) {
super(person);
}
@Override
public void eat() {
super.eat();
drink();
}
public void drink(){
System.out.println("学生喝牛奶");
}
}
public class StudentDecoratorB extends Decorator {
public StudentDecoratorB(Person person) {
super(person);
}
@Override
public void eat() {
super.eat();
drink();
}
public void drink(){
System.out.println("学生喝豆浆");
}
}
2.5 客户端
public class Client {
public static void main(String[] args) {
Student student = new Student();
Person p = new StudentDecoratorA(student);
p.eat();
p = new StudentDecoratorB(student);
p.eat();
}
}
3. 优点
- 比继承更灵活
- 将功能分离到每个装饰器,然后通过对象组合的方式,在运行时动态地组合功能
- 更容易复用功能
- 一般一个装饰器只实现一个功能,一个对象可以增加多个装饰器,一个装饰器也可以装饰不同的对象
- 简化高层定义
- 高层只需要定义最基本功能,通过组合相应的装饰器来完成需要的功能
4. 缺点
- 会产生很多细粒度的对象