设计模式-装饰模式 Decorator-1) 原理

时间:2024-02-16 17:36:51

装饰器设计模式(Decorator)是一种结构型设计模式,它允许动态地为对象添加新的行为。它通过创建一个包装器来实现,即将对象放入一个装饰器类中,再将装饰器类放入另一个装饰器类中,以此类推,形成一条包装链。这样,我们可以在不改变原有对象的情况下,动态地添加新的行为或修改原有行为

在 Java 中,实现装饰器设计模式的步骤如下:

1、定义一个接口或抽象类,作为被装饰对象的基类。

public interface Component {
    void operation();
}

在这个示例中,我们定义了一个名为 Component 的接口,它包含一个名为 operation 的抽象方法,用于定义被装饰对象的基本行为。

2、定义一个具体的被装饰对象,实现基类中的方法。

public class ConcreteComponent implements Component{
    @Override
    public void operation() {
        System.out.println("这是未被包装的原始类");
    }
}

在这个示例中,我们定义了一个名为 ConcreteComponent 的具体实现类,实现了 Component 接口中的 operation 方法。

3、定义一个抽象装饰器类,继承基类,并将被装饰对象作为属性。

public abstract class Decorator implements Component {
    // 装饰器设计模式使用组合的形式进行装饰
    Component component;

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

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

在这个示例中,我们定义了一个名为 Decorator 的抽象类,继承了 Component 接口,并将被装饰对象作为属性。在 operation 方法中,我们调用被装饰对象的同名方法。

4、定义具体的装饰器类,继承抽象装饰器类,并实现增强逻辑。

public class DecoratorOne extends Decorator{
    public DecoratorOne(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        System.out.println("这是前边添加了行为! 第一次包装");
        super.operation();
        System.out.println("这是后边添加了行为! 第一次包装");
    }
}
public class DecoratorTwo extends Decorator{
    public DecoratorTwo(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        System.out.println("这是前边添加了行为! 第二次包装");
        super.operation();
        System.out.println("这是后边添加了行为! 第二次包装");
    }
}

在这个示例中,我们定义了一个名为 DecoratorOneDecoratorTwo 的具体装饰器类,继承了 Decorator 抽象类,并实现了 operation 方法的增强逻辑。在 operation 方法中,我们先调用被装饰对象的同名方法,然后添加新的行为。

5、使用装饰器增强被装饰对象。

public class Main {
    public static void main(String[] args) {
        // 1. 创建一个原始对象
        Component component = new ConcreteComponent();

        // 2.进行第一次包装
        component = new DecoratorOne(component);

        // 3.进行第二次包装
        component = new DecoratorTwo(component);

        component.operation();
    }
}
这是前边添加了行为! 第二次包装
这是前边添加了行为! 第一次包装
这是未被包装的原始类
这是后边添加了行为! 第一次包装
这是后边添加了行为! 第二次包装