装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊包装类中来给对象动态地添加新的行为。装饰者模式提供了一种灵活的方式,使得客户端可以单独扩展对象的功能,而不需要修改其结构。
在装饰者模式中,有几个关键角色:
假设我们有一杯咖啡,我们可以动态地给它添加调料(如牛奶、糖等):
// 组件接口class Coffee {cost() {return 5; // 基础咖啡价格}}// 具体组件class SimpleCoffee extends Coffee {}// 装饰者class CoffeeDecorator extends Coffee {constructor(coffee) {super();this._coffee = coffee;}cost() {return this._coffee.cost();}}// 具体装饰者 - 牛奶class MilkDecorator extends CoffeeDecorator {constructor(coffee) {super(coffee);}cost() {return super.cost() + 2; // 加牛奶的价格}}// 具体装饰者 - 糖class SugarDecorator extends CoffeeDecorator {constructor(coffee) {super(coffee);}cost() {return super.cost() + 1; // 加糖的价格}}// 客户端代码const simpleCoffee = new SimpleCoffee();console.log(`Cost of Simple Coffee: $${simpleCoffee.cost()}`);const milkCoffee = new MilkDecorator(simpleCoffee);console.log(`Cost of Coffee with Milk: $${milkCoffee.cost()}`);const sugarMilkCoffee = new SugarDecorator(milkCoffee);console.log(`Cost of Coffee with Milk and Sugar: $${sugarMilkCoffee.cost()}`);
在这个例子中,Coffee
是组件接口,SimpleCoffee
是具体组件。CoffeeDecorator
是装饰者,MilkDecorator
和 SugarDecorator
是具体装饰者。通过装饰者模式,我们可以动态地将调料添加到咖啡中,而不需要修改咖啡类本身。客户端可以根据需要组合不同的装饰者,实现了灵活的行为扩展。