定義
裝飾者模式能夠在不改變對象自身的基礎上,在程序運行期間給對象動態地增加職責。
要點
- 傳統的裝飾者模式,將對象放入到另一個對象之中,這些對象以一條鏈的方式進行引用。這些對象都擁有相同的接口,當請求到達鏈中的某個對象時,這個對象會執行自身的操作,隨後把請求轉發給鏈中的下一個對象。
- 裝飾函數:在不改變函數源代碼的情況下,能給函數增加功能。
- 如果不喜歡 Function.prototype.before 和 Function.prototype.after 這種汙染原型的方式,可以定義 before 和 after 方法,接受原函數和新函數作為參數。
- 裝飾函數的應用實例:分離業務代碼和數據統計代碼;改變函數的參數;插件式的表單驗證。
- 裝飾函數返回的是一個新函數,如果在原函數上保存了一些屬性,那麼這些屬性會丟失。
- 裝飾者模式和代理模式的結構相似,都保留了對另外一個對象的引用,並且向那個對象發送請求。兩者最重要的區別在於意圖和設計目的不同。代理模式的本體提供了關鍵功能,而代理提供或拒絕對它的訪問,或者在訪問前做一些額外的事情,本體和代理間是一種靜態的關係;裝飾者模式的目的則是為對象動態加入行為。
核心代碼
Function.prototype.before(beforeFn) {
var self = this;
return function() {
beforeFn.apply(this, arguments);
return self.apply(this, arguments);
};
}
var before = function(fn, beforeFn) {
return function() {
beforeFn.apply(this, arguments);
return fn.apply(this, arguments);
};
};