裝飾者模式說明
說明:通一個類別來動態的對另一個類別的功能物件進行前或後的修飾,給它輔加一些額外的功能; 這是對一個類別物件功能的裝飾,裝飾的類比被裝飾的類,要求擁有相同的訪問接口方法(功能),這在動態面向對象類裡,一般以實現同一個接口(interface)來約束實現;裝飾類的要有對被裝飾類的引用,用於在裝飾類別的對應方法,呼叫對應被裝飾類別的方法,然後對其進行修飾;
場景舉例:
1>. 例如我們生活中的穿衣服, 一件襯衣,一件西裝外套,一條褲子,一條領帶,一雙漂亮的皮鞋; 每多穿一件,都是對前面一件或全身的裝飾;
2>. 例如我們有個類別下的功能方法,可能用於寫日誌,可能用於用戶登陸這樣的功能,也許寫入日誌前需要獲取當前操作者信息,或者是登錄成功後,寫入一條日誌;寫入日誌之前的額外操作,它的總體來說也還是一個寫日誌的目的;登孫成功後寫日誌,它總體上也是一個登錄過程的操作信息;
因此裝飾者模式用於實現,兩者相似操作的一種場景;就是裝飾者對被裝飾者功能物件的擴展,本質還是原方法相同的功能範圍;
實例源碼
1. 被裝飾者類別
Wear.prototype.Shirt = function() {
//穿了件襯衫
console.log('穿上襯衫');
}
2. 裝飾者類別
Decorator.prototype.Shirt = function() {
this.wear.Shirt();
//穿了件襯衫後,我又加上了領帶
}
3. 使用方法
這樣就實現了對Wear 穿襯衫這個功能對象的動態擴展裝飾,你也不必知道原被裝飾方法是如何執行,只要知道它的功能是什麼就可以,然後知道我們要對其輔加的額外功能是什麼就可以;
其他說明
裝飾者模式,真正提現了面向對象方法的:對擴展開放,對修改關閉的原則;所有想要的功能方法,都是在沒有修改[被裝飾類Wear]在擴展[裝飾者這個類Decorator]的情況下進行的;
裝飾者模式的一個主要特點,就是裝飾者對被裝飾者的引用,以實現對被裝飾者的無修改裝飾;
模擬下:先穿襯衫,再穿領帶,再穿西裝的場景: 上面的被裝飾者不變了:
2. 裝飾者類別:
3. 創造類似繼承 Decorator 子類別的 穿領帶類別與穿西裝類別
function Decorator_Western (decorator) {
this.decorator = decorator;
}
Decorator_Western.prototype.Shirt = function() {
this.decorator.Shirt();
console.log('再穿上西裝');
}
使用方法:
這是一個穿衣服裝飾的模擬例子;