推荐答案
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象增加新的行为。装饰器模式的核心思想是动态地给一个对象添加一些额外的职责,而不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
与继承相比,装饰器模式提供了更加灵活的方式来扩展对象的功能。继承是静态的,一旦子类继承了父类,就无法在运行时改变其行为。而装饰器模式允许你在运行时动态地添加或移除功能,且不需要修改原有代码。
本题详细解读
装饰器模式的概念
装饰器模式通过创建一个装饰器类,该类持有一个指向被装饰对象的引用,并且实现了与被装饰对象相同的接口。这样,装饰器类可以在调用被装饰对象的方法之前或之后执行额外的操作,从而扩展了被装饰对象的功能。
装饰器模式的作用
- 动态扩展功能:装饰器模式允许你在不修改原有代码的情况下,动态地给对象添加新的功能。
- 避免类爆炸:通过使用装饰器模式,你可以避免通过继承来扩展功能时产生的类爆炸问题。
- 单一职责原则:装饰器模式遵循单一职责原则,每个装饰器类只负责一个特定的功能扩展。
装饰器模式与继承的区别
- 灵活性:装饰器模式比继承更加灵活,因为它允许在运行时动态地添加或移除功能,而继承是静态的,无法在运行时改变。
- 代码复用:装饰器模式通过组合而非继承来实现代码复用,这样可以避免继承层次过深导致的复杂性。
- 扩展性:装饰器模式可以轻松地扩展对象的功能,而继承则需要创建新的子类,可能会导致类层次结构变得复杂。
示例代码
// www.javascriptcn.com code example
// 被装饰的类
class Coffee {
cost() {
return 5;
}
}
// 装饰器类
class MilkDecorator {
constructor(coffee) {
this.coffee = coffee;
}
cost() {
return this.coffee.cost() + 2;
}
}
// 使用装饰器
let coffee = new Coffee();
console.log(coffee.cost()); // 输出: 5
let milkCoffee = new MilkDecorator(coffee);
console.log(milkCoffee.cost()); // 输出: 7在这个例子中,MilkDecorator 类是一个装饰器,它扩展了 Coffee 类的功能,增加了牛奶的成本,而不需要修改 Coffee 类的代码。