裝飾者模式
在不改變原對象的基礎上,通過對其進行包裝拓展(添加屬性或者方法)使原有對象可以滿足用戶的更復雜需求。
實例
假定我們現在有一個方法及調用,如下:
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);
}
這樣我們可以不修改已有的功能,但是能夠實現拓展新的功能。
總結
上面只是一個非常非常簡單的實例,只是爲了幫助說明裝飾者模式的一種使用方式。
裝飾者模式解決的核心問題是在不改變原有代碼的基礎上擴展新的功能。
對比前面的適配器模式,適配器模式更多的需要了解已有功能的細節,並作出相應的適配修改,但是裝飾者模式一般只是對原有的功能做一些拓展,可以不關注原有功能的細節。