装饰器设计模式(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("这是后边添加了行为! 第二次包装");
}
}
在这个示例中,我们定义了一个名为 DecoratorOne
和 DecoratorTwo
的具体装饰器类,继承了 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();
}
}
这是前边添加了行为! 第二次包装
这是前边添加了行为! 第一次包装
这是未被包装的原始类
这是后边添加了行为! 第一次包装
这是后边添加了行为! 第二次包装