跳到主要内容

装饰器模式

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个对象动态添加新的行为,而无需改变其原始类的代码。这种模式以对客户端透明的方式扩展对象的功能。

在装饰器模式中,创建一个装饰器类,它包含一个指向具体组件的引用,并实现了与组件相同的接口。这样,可以将一个或多个装饰器组合在一起,以增强组件的行为。

以下是一个简单的 JavaScript 示例,演示了装饰器模式:

// 组件接口
class Component {
operation() {
throw new Error('operation method must be implemented by subclasses.');
}
}

// 具体组件
class ConcreteComponent extends Component {
operation() {
return 'ConcreteComponent';
}
}

// 装饰器抽象类
class Decorator extends Component {
constructor(component) {
super();
this.component = component;
}

operation() {
return this.component.operation();
}
}

// 具体装饰器A
class ConcreteDecoratorA extends Decorator {
operation() {
return `ConcreteDecoratorA(${super.operation()})`;
}
}

// 具体装饰器B
class ConcreteDecoratorB extends Decorator {
operation() {
return `ConcreteDecoratorB(${super.operation()})`;
}
}

// 客户端代码
const component = new ConcreteComponent();
const decoratedComponentA = new ConcreteDecoratorA(component);
const decoratedComponentB = new ConcreteDecoratorB(decoratedComponentA);

console.log(decoratedComponentB.operation());
// Output: ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))

在这个例子中,Component 是组件接口,ConcreteComponent 是具体组件,Decorator 是装饰器抽象类,它包含一个指向具体组件的引用,并实现了与组件相同的接口。ConcreteDecoratorAConcreteDecoratorB 是具体装饰器,它们分别增强了组件的行为。

通过将装饰器层层嵌套,可以灵活地组合和扩展对象的功能,而无需修改原始组件的代码。这使得装饰器模式成为一种有效的方式来添加、移除或扩展对象的责任。

装饰器模式在实际应用中经常用于以下场景:

  • 在不改变现有对象结构的情况下,动态添加新功能。
  • 对象的功能需要根据不同的条件进行组合。
  • 避免使用子类进行扩展,以防止类爆炸的问题。