Java设计模式之装饰器模式(Decorator)

50 阅读2分钟

装饰器模式(Decorator Pattern)是一种结构型设计模式,用于在不修改对象自身的基础上,动态地给单个对象添加额外的职责。这种模式通过创建一个包装对象,来包裹实际对象,然后在包装对象中添加额外的功能。

装饰器模式包含以下几个关键角色:

  1. Component(组件接口) :定义了可以动态添加职责的对象接口。
  2. ConcreteComponent(具体组件) :实现了组件接口的具体类。
  3. Decorator(抽象装饰者) :持有一个组件接口的引用,并定义了与组件接口相同的接口。
  4. ConcreteDecorator(具体装饰者) :实现抽象装饰者,给具体组件添加职责。

装饰器模式的典型代码结构如下:

// 组件接口
interface Component {
    void operate();
}

// 具体组件
class ConcreteComponent implements Component {
    @Override
    public void operate() {
        System.out.println("ConcreteComponent operate");
    }
}

// 抽象装饰者
abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operate() {
        component.operate();
    }
}

// 具体装饰者A
class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        super.operate();
        addBehavior();
    }

    private void addBehavior() {
        System.out.println("Add behavior for ConcreteDecoratorA");
    }
}

// 具体装饰者B
class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        super.operate();
        addBehavior();
    }

    private void addBehavior() {
        System.out.println("Add behavior for ConcreteDecoratorB");
    }
}

使用装饰器模式的示例:

public class DecoratorDemo {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        component.operate();

        System.out.println("\nWith Decorator A:");
        Component decoratedComponentA = new ConcreteDecoratorA(component);
        decoratedComponentA.operate();

        System.out.println("\nWith Decorator B:");
        Component decoratedComponentB = new ConcreteDecoratorB(component);
        decoratedComponentB.operate();
    }
}

输出结果:

ConcreteComponent operate

With Decorator A:
ConcreteComponent operate
Add behavior for ConcreteDecoratorA

With Decorator B:
ConcreteComponent operate
Add behavior for ConcreteDecoratorB

装饰器模式的优点包括:

  • 灵活性:可以在运行时动态地添加或修改对象的职责。
  • 扩展性:可以容易地扩展新的行为,而不需要修改现有代码。
  • 透明性:不会影响客户端使用原始对象。

装饰器模式的缺点包括:

  • 增加系统复杂性:每增加一个装饰者,就需要增加一个装饰者类。
  • 降低性能:装饰者模式可能会增加系统的性能开销。

装饰器模式适用于以下场景:

  • 当需要动态地给对象添加职责,同时又希望不修改原有对象时。
  • 当需要通过一种无须继承的方式,来扩展对象的功能时。
  • 当需要通过多个不同的装饰者来装饰一个对象时。