结构型模式之装饰者模式
装饰者模式(Decorator Pattern)
装饰者模式是一种结构型设计模式,它允许你动态地向对象添加额外的功能。装饰者模式通过创建一个包装器类, 将原始对象封装在其中,并提供了与原始对象相同的接口,以便其他对象可以透明地使用被装饰后的对象。
在装饰者模式中,有四个关键角色: 抽象组件(Component):定义了原始对象和装饰器对象的共同接口。 具体组件(Concrete Component):实现了抽象组件的接口,是被装饰的原始对象。 抽象装饰器(Decorator):继承自抽象组件,并持有一个抽象组件的引用,用于封装具体组件并增加额外的行为。 具体装饰器(Concrete Decorator):继承自抽象装饰器,实现了额外的行为,并调用抽象组件的方法。
使用装饰者模式可以灵活地组合多个装饰器对象,实现对原始对象的动态扩展,而无需修改其代码。 这种模式遵循开放-封闭原则,即对扩展开放,对修改封闭。
/** * @author zhou * 抽象组件 */ interface Component { void operation(); } /** * @author zhou * 具体组件 */ class ConcreteComponent implements Component { public void operation() { System.out.println("执行具体组件的操作"); } } /** * @author zhou * 具体装饰器A */ class ConcreteDecoratorA extends Decorator { ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); System.out.println("增加额外的功能A"); } } /** * @author zhou * 具体装饰器B */ class ConcreteDecoratorB extends Decorator { ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); System.out.println("增加额外的功能B"); } } /** * @author zhou * 抽象装饰器 */ abstract class Decorator implements Component { private Component component; Decorator(Component component) { this.component = component; } public void operation() { component.operation(); } } /** * @author zhou * 客户端使用 */ public class Client { public static void main(String[] args) { // 创建具体组件对象 Component component = new ConcreteComponent(); // 对具体组件对象进行装饰,可以多次装饰 Component decoratedComponent = new ConcreteDecoratorA(new ConcreteDecoratorB(component)); // 调用装饰后的对象的方法 decoratedComponent.operation(); } }
在上述示例中,抽象组件 Component 定义了原始对象和装饰器对象的共同接口,其中 ConcreteComponent 是具体组件实现了该接口。
抽象装饰器 Decorator 继承自 Component,并持有一个 Component 的引用作为成员变量。 具体的装饰器类 ConcreteDecoratorA 和 ConcreteDecoratorB 继承自 Decorator,在继承的基础上增加了额外的功能。
在客户端代码中,创建了具体组件对象 ConcreteComponent。 然后使用装饰器对该对象进行装饰,可以通过多次装饰来添加不同的功能。 最后,调用装饰后的对象的方法,会依次执行被装饰对象和每个装饰器对象的操作。