当我们想要在不改变原有对象的结构和功能的基础上,动态地给一个对象添加一些额外的行为或职责时,可以使用装饰器模式。
在装饰器模式中,通常会定义一个抽象装饰器类和具体的装饰器类。抽象装饰器类和被装饰对象实现同样的接口,而具体的装饰器类则包含了一个指向被装饰对象的引用,并且在其基础上增加了额外的行为或职责。
通过这种方式,我们可以在运行时动态地给一个对象添加所需要的行为或职责,而不必修改原有对象的结构或代码。同时,由于采用了组合的方式,我们可以灵活地对多个装饰器进行组合,以满足不同的需求。
装饰器模式广泛应用于Java中的IO流、Swing中的GUI组件等领域,也是Python中的装饰器(@decorator)机制的基础。
示例代码:
首先我们定义一个接口 Component
作为被装饰对象和抽象装饰器类的共同接口。
public interface Component {
void operation();
}
然后定义一个具体的实现类 ConcreteComponent
:
public class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("执行具体操作");
}
}
接下来定义一个抽象装饰器类 Decorator
:
public abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
最后,我们定义一个具体的装饰器类 ConcreteDecorator
:
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
addBehavior();
}
private void addBehavior() {
System.out.println("添加额外的行为");
}
}
使用时,我们可以构造一个原有的 ConcreteComponent
对象,然后通过不断地用具体的装饰器类进行包装,来动态地给其添加额外的行为。例如:
Component component = new ConcreteComponent();
component.operation(); // 输出 "执行具体操作"
Component decorator1 = new ConcreteDecorator(component);
decorator1.operation(); // 输出 "执行具体操作",然后输出 "添加额外的行为"
Component decorator2 = new ConcreteDecorator(decorator1);
decorator2.operation(); // 输出 "执行具体操作",然后输出 "添加额外的行为",再次输出 "添加额外的行为"
在这个示例中,我们首先创建了一个 ConcreteComponent
对象,然后将其分别用 ConcreteDecorator
类进行包装。每一次包装都会动态地给原有对象添加额外的行为,并且不影响原有对象的结构和功能。