在《JavaScript設計模式》介紹中,裝飾者模式跟Mixin(混入)模式相比,是另一種可行的對象子類化(Mixin模式乾的事)的替代方案。 裝飾者(Decorator)模式 定義: 給對象動態添加額外的功能。向基本對象添加(裝飾)屬性或方法,而不是進行子類化,它較為精簡。 使用場景: java ...
在《JavaScript設計模式》介紹中,裝飾者模式跟Mixin(混入)模式相比,是另一種可行的對象子類化(Mixin模式乾的事)的替代方案。 裝飾者(Decorator)模式 定義: 給對象動態添加額外的功能。向基本對象添加(裝飾)屬性或方法,而不是進行子類化,它較為精簡。 使用場景: java IO 流是典型的裝飾模式。 PS:應用程式包含需要大量不同類型對象的功能。 例子:
// The constructor to decorate function MacBook() { this.cost = function () { return 997; }; this.screenSize = function () { return 11.6; }; } // Decorator 1 function memory( macbook ) { var v = macbook.cost(); macbook.cost = function() { return v + 75; }; } // Decorator 2 function engraving( macbook ){ var v = macbook.cost(); macbook.cost = function(){ return v + 200; }; } // Decorator 3 function insurance( macbook ){ var v = macbook.cost(); macbook.cost = function(){ return v + 250; }; } var mb = new MacBook(); memory( mb ); engraving( mb ); insurance( mb ); // Outputs: 1522 console.log( mb.cost() ); // Outputs: 11.6 console.log( mb.screenSize() );裝飾並沒有重寫原始Macbook對象的構造函數方法(如screenSize())、其他屬性也一樣,依然保持不變並完好無損。 PS:這個裡面關鍵點在於裝飾是實例對象,而不是類。 優點: 1. Decorator模式與繼承關係的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。 2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合對象。 缺點: 1. 這種比繼承更加靈活機動的特性,也同時意味著更加多的複雜性。 2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得很複雜。(這裡類是來裝飾對象的) 裝飾者模式跟混入模式區別 1. 裝飾者模式給對象動態增加功能,可以裝飾多次。(裝飾者模式修改的是實例對象) PS:裝飾可以用類或者實例對象,這裡不要誤會了。 2. 混入模式綜合多個類的功能產生一個類。(混入模式修改的是類) 總結 裝飾者模式和混入模式,最終目的都是為了增強對象的功能,只不過增強的手段不一樣。另外在JavaScript上使用設計模式,也不必模仿面向對象語言規規矩矩地寫(像最上面圖示),那就有點僵了。 參考文獻 1. 裝飾模式 (百度百科) 2. 《JavaScript設計模式》by 徐濤【譯】 本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。 本文地址 :http://www.cnblogs.com/lovesong/p/5625245.html