装饰器模式:动态给一个对象添加一些额外的职责

发布时间 2023-04-25 10:52:01作者: 穆海如枫

当我们想要在不改变原有对象的结构和功能的基础上,动态地给一个对象添加一些额外的行为或职责时,可以使用装饰器模式。

在装饰器模式中,通常会定义一个抽象装饰器类和具体的装饰器类。抽象装饰器类和被装饰对象实现同样的接口,而具体的装饰器类则包含了一个指向被装饰对象的引用,并且在其基础上增加了额外的行为或职责。

通过这种方式,我们可以在运行时动态地给一个对象添加所需要的行为或职责,而不必修改原有对象的结构或代码。同时,由于采用了组合的方式,我们可以灵活地对多个装饰器进行组合,以满足不同的需求。

装饰器模式广泛应用于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 类进行包装。每一次包装都会动态地给原有对象添加额外的行为,并且不影响原有对象的结构和功能。