一、概述
动态地给一个对象添加一些额外的职责。装饰模式比生成子类更为灵活。
二、适用性
1.在不影响其他对象的情况下,以动态、透明的方式给但个对象添加职责。
2.处理那些可以撤销的职责。
3.当不能采用生成子类的方式进行扩展的时候。
三、参与者
1.Component:定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。
3.Decorator:维持一个指向Component对象的指针,并且定义一个与Component接口一致的接口。
4.ConcreteDecorator:向组件添加职责。
四、类图
五、示例
Component
package cn.lynn.decorator;
public interface IAnimal {
public void eat();
}
ConcreteComponent
package cn.lynn.decorator;
public class Dog implements IAnimal {
@Override
public void eat() {
System.out.println("狗啃骨头!");
}
}
Decorator
package cn.lynn.decorator;
public abstract class Decorator implements IAnimal {
private IAnimal animal;
public void setAnimal(IAnimal animal) {
this.animal = animal;
}
@Override
public void eat() {
animal.eat();
}
}
ConcreteDecorator
package cn.lynn.decorator;
public class DogDecoratorA extends Decorator {
@Override
public void eat() {
super.eat();
transform();
}
public void transform() {
System.out.println("机器狗变形出发!");
}
}
package cn.lynn.decorator;
public class DogDecoratorB extends Decorator {
@Override
public void eat() {
super.eat();
say();
}
public void say() {
System.out.println("旺旺!");
}
}
Client
package cn.lynn.decorator;
public class Client {
public static void main(String[] args) {
Dog dog = new Dog();
DogDecoratorA dogDecoratorA = new DogDecoratorA();
DogDecoratorB dogDecoratorB = new DogDecoratorB();
dogDecoratorA.setAnimal(dog);
dogDecoratorB.setAnimal(dogDecoratorA);
dogDecoratorB.eat();
}
}
Result
狗啃骨头!
机器狗变形出发!
旺旺!