装饰器模式是一种结构型设计模式,它允许在运行时动态地将行为附加到对象上。这种模式通常用于扩展对象的功能,而无需修改其结构。装饰器模式的核心思想是定义一个接口,然后通过实现该接口的装饰器类来动态地为对象添加新的行为。这种方式使得对象可以在不改变原有代码的基础上,灵活地添加新的功能。
在计算机科学中,设计模式是一种被广泛接受并应用的解决方案,它们为特定的问题提供了一种可重用的解决方案,装饰器模式是这其中的一种,它提供了一种动态地给对象添加额外职责的方法,而不需要修改其原始类,这种模式通常用于在运行时添加新的行为到现有的对象上,例如日志记录、性能测量等。
装饰器模式的核心思想是“合成”和“委托”,在合成模式中,我们创建了一个新的对象,同时又继承了原有对象的属性和方法,而在委托模式中,我们将一些功能封装到一个代理对象中,然后让需要使用这个功能的类来持有这个代理对象。
装饰器模式的基本结构如下:
1、抽象组件(Component):这是需要被装饰的对象,所有的具体装饰器都必须实现这个接口。
2、具体装饰器(ConcreteDecorator):这是一个实现了抽象组件接口的具体类,它可以持有一个抽象组件的引用,并且可以在内部调用它的方法。
3、抽象装饰器(AbstractDecorator):这是一个抽象类,它也实现了抽象组件接口,它包含一个抽象组件的引用,但是不能直接调用其方法,而是通过具体装饰器来调用。
4、客户端(Client):这是使用装饰器模式的类,它持有一个抽象组件的引用,并且可以通过这个引用来调用其方法。
下面是一个简单的装饰器模式的例子:
public interface Component { void operation(); } public class ConcreteComponent implements Component { @Override public void operation() { System.out.println("ConcreteComponent operation"); } } public abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; } @Override public void operation() { component.operation(); } } public class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } @Override public void operation() { super.operation(); // 先执行父类的操作 System.out.println("ConcreteDecorator operation"); // 再添加自己的操作 } }
在这个例子中,ConcreteComponent
是具体的组件,它有一个operation
方法。Decorator
是抽象的装饰器,它也有一个operation
方法,但是它通过ConcreteDecorator
来调用ConcreteComponent
的operation
方法,当我们创建一个ConcreteDecorator
并调用其operation
方法时,输出的结果将会是:先执行ConcreteComponent
的操作,然后再执行ConcreteDecorator
的操作。