装饰者模式
在不改变原对象的基础上,通过对其进行包装拓展(添加属性或者方法)使原有对象可以满足用户的更复杂需求。
实例
假定我们现在有一个方法及调用,如下:
function changeData(target, key, newV) {
target[key] = newV;
}
function callChangeData(){
let target = {
a: 1
}
changeData(target,'a', 100);
}
原有功能是将为一个对象的属性赋一个值,且值是数字,但是现在需求变了,我希望能给这个数字一个名字,区别一下这个数字是干嘛用的。
直接修改源功能代码是可行的。但是有时候可能原有的接口在项目中其他很多地方会用到,如果我们贸然的改了现有的接口指不定会出现什么bug。而且有时候我们导入的是一个外部的库,就更不好修改了。这时候我们可以考虑用装饰者模式扩展已有的功能。如下:
function decorator(target,key,newV,name) {
newV = {
name: name,
value: newV
}
changeData(target,key,newV);
}
这样我们可以不修改已有的功能,但是能够实现拓展新的功能。
总结
上面只是一个非常非常简单的实例,只是为了帮助说明装饰者模式的一种使用方式。
装饰者模式解决的核心问题是在不改变原有代码的基础上扩展新的功能。
对比前面的适配器模式,适配器模式更多的需要了解已有功能的细节,并作出相应的适配修改,但是装饰者模式一般只是对原有的功能做一些拓展,可以不关注原有功能的细节。