一、概述
动态地给一个对象添加一些额外的职责。装饰模式比生成子类更为灵活。
二、适用性
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
- 狗啃骨头!
- 机器狗变形出发!
- 旺旺!