装饰器模式是一种结构型设计模式,它允许在不修改对象结构的情况下向对象添加新功能。这种模式通常用于在运行时动态地为对象添加新的功能,例如日志记录、性能监控等。装饰器模式的主要角色包括装饰器类和被装饰类。装饰器类负责实现新的功能,而被装饰类则保留原有的功能。通过组合不同的装饰器类,可以为对象添加多种功能,而无需修改其结构。
1、抽象组件(Component):这是一个接口,定义了客户端和装饰器之间的共同契约,抽象组件的具体实现类将作为具体的组件类,实现抽象组件的接口。
2、具体组件(ConcreteComponent):这是抽象组件的具体实现类,实现了抽象组件的接口,具体组件可以是任何具有一定功能的类,例如一个简单的计算器。
3、装饰器(Decorator):这是一个实现了抽象组件接口的类,它也实现了具体组件的接口,装饰器通过继承具体组件类来扩展其功能,同时保留了具体组件的基本功能,装饰器可以在运行时动态地为对象添加新的功能,而不需要修改对象的结构。
4、客户端(Client):这是使用抽象组件和装饰器的类,客户端与抽象组件和具体组件进行交互,而不关心它们是如何实现的,客户端只需要知道如何调用这些组件的方法即可。
下面是一个简单的装饰器模式示例:
// 抽象组件 public interface Component { void operation(); } // 具体组件 public class ConcreteComponent implements Component { @Override public void operation() { System.out.println("具体组件的操作"); } } // 装饰器A public class DecoratorA extends ConcreteComponent { @Override public void operation() { super.operation(); System.out.println("装饰器A添加的功能"); } } // 装饰器B public class DecoratorB extends ConcreteComponent { @Override public void operation() { super.operation(); System.out.println("装饰器B添加的功能"); } } // 客户端 public class Client { public static void main(String[] args) { Component component = new ConcreteComponent(); component = new DecoratorA(component); component = new DecoratorB(component); component.operation(); } }
在这个示例中,我们首先定义了一个抽象组件Component
,它有一个operation()
方法,我们定义了一个具体组件ConcreteComponent
,它实现了Component
接口,我们定义了两个装饰器类DecoratorA
和DecoratorB
,它们分别继承自ConcreteComponent
并实现了Component
接口,我们定义了一个客户端类Client
,它使用抽象组件和装饰器类来完成一些操作。