裝飾者模式

裝飾者模式就是一種給對象動態添加職責的模式。裝飾者模式能夠在不改變對象自身的情況下,在程序運行期間動態的給對象添加職責。

我們可以使用AOP來裝飾函數:

Function.prototype.before = function(beforeFunc) {
    var _self = this;      // 保存原函數的引用
    return function() {    // 返回包含原函數和新函數的代理函數
        beforeFunc.apply(this, arguments);     // 執行新函數,保證this不被劫持,並將參數傳入
        var ret = _self.apply(this, arguments);   // 執行原函數,保證this不被劫持

        return ret;
    }
}

Function.prototype.after = function(afterFunc) {
    var _self = this;
    return function() {
        var ret = _self.apply(this, arguments);
        afterFunc.apply(this, arguments);

        return ret;
    }
}

裝飾者模式和代理模式的結構看起來非常相像,這兩種模式都描述了怎樣爲對象提供一定程度上的間接引用,它們的實現部分都保留了對另外一個對象的引用,並且向那個對象發送請求。

代理模式和裝飾者模式最重要的區別在於它們的意圖和設計目的。

代理模式的目的是,當直接訪問本體不方便或者不符合需要時,爲這個本體提供一個替代者。本體定義了關鍵功能,而代理提供或拒絕對它的訪問,或者在訪問本體之前做一些額外的事情。

裝飾者模式的作用就是爲對象動態加入行爲。換句話說,代理模式強調一種關係(Proxy 與它的實體之間的關係),這種關係可以靜態的表達,也就是說,這種關係在一開始就可以被確定。而裝飾者模式用於一開始不能確定對象的全部功能時。代理模式通常只有一層代理本體的引用,而裝飾者模式經常會形成一條長長的裝飾鏈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章