裝飾者模式

定義

裝飾者模式能夠在不改變對象自身的基礎上,在程序運行期間給對象動態地增加職責。

要點

  • 傳統的裝飾者模式,將對象放入到另一個對象之中,這些對象以一條鏈的方式進行引用。這些對象都擁有相同的接口,當請求到達鏈中的某個對象時,這個對象會執行自身的操作,隨後把請求轉發給鏈中的下一個對象。
  • 裝飾函數:在不改變函數源代碼的情況下,能給函數增加功能。
  • 如果不喜歡 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);
    };
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 學習如何創建對象時理解面向對象的第一步。第二部時理解繼承。在傳統面向對象的語言中,類從其他類繼承屬性。然而在jav...
    WanLum阅读 1,924评论 0 0
  • javascript有很多創建對象的模式,完成工作的方式也不只一種。你可以隨時定義自己的類型或自己的泛用對象。可以...
    WanLum阅读 1,768评论 0 0
  • 提問的智慧 How To Ask Questions The Smart Way Copyright © 2001...
    Albert陈凯阅读 7,170评论 0 8
  • 湖人是NBA夺得总冠军仅次于凯尔特人的球队,前两个赛季因为科比的老去,球队的重建,一度成为联盟人见人欺的鱼腩球队。...
    闲听风雨阅读 1,482评论 0 0
  • 爱是一个永恒的话题,有人说,爱是天长地久。有人说,爱是曾经拥有。 第一章 ...
    若兮s西贝儿阅读 3,916评论 0 1