装饰器模式(Decorator Pattern)是一种结构型设计模式,用于在不修改对象自身的基础上,动态地给单个对象添加额外的职责。这种模式通过创建一个包装对象,来包裹实际对象,然后在包装对象中添加额外的功能。
装饰器模式包含以下几个关键角色:
- Component(组件接口) :定义了可以动态添加职责的对象接口。
- ConcreteComponent(具体组件) :实现了组件接口的具体类。
- Decorator(抽象装饰者) :持有一个组件接口的引用,并定义了与组件接口相同的接口。
- 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
装饰器模式的优点包括:
- 灵活性:可以在运行时动态地添加或修改对象的职责。
- 扩展性:可以容易地扩展新的行为,而不需要修改现有代码。
- 透明性:不会影响客户端使用原始对象。
装饰器模式的缺点包括:
- 增加系统复杂性:每增加一个装饰者,就需要增加一个装饰者类。
- 降低性能:装饰者模式可能会增加系统的性能开销。
装饰器模式适用于以下场景:
- 当需要动态地给对象添加职责,同时又希望不修改原有对象时。
- 当需要通过一种无须继承的方式,来扩展对象的功能时。
- 当需要通过多个不同的装饰者来装饰一个对象时。