使用场景
由于开闭原则和里氏替换原则的约束,我们尽量不能通过重写改变继承对象的方法,也尽量少的修改原对象的方法。这时候装饰模式就派上用场了。
装饰模式
装饰模式是保持原有的行为的情况下,新增其他行为。装饰器属于装饰模式的一种实践,语言提供了原生的支持。
最简单的实践方法是在 Function 的原型上挂装饰方法,因为所有的函数都能访问到 Function 的原型上的东西。
Function.prototype.decorate = function (fn) {
// 惰性执行,同时提供链式调用
return () => {
this()
fn()
}
}
使用方法:
class Dog {
sayHello() {
console.log('hello')
}
}
function wagTail () {
console.log('tail')
}
const dog = new Dog()
dog.sayHello.decorate(wagTail)()
有了装饰模式就能很方便的扩展功能。如果想提供更多样的功能的话,可以封装一个创建装饰模式的函数。