结构型模式之装饰者模式
装饰者模式(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。 然后使用装饰器对该对象进行装饰,可以通过多次装饰来添加不同的功能。 最后,调用装饰后的对象的方法,会依次执行被装饰对象和每个装饰器对象的操作。
