這是本人的設計模式學習筆記,把本身學習過程當中的一些總結和認識記錄下來,與諸君共勉。設計模式
所謂裝飾者,就是爲以前的對象添加行爲的存在,容許行爲能夠被修改而無需修改現有代碼。要想了解裝飾者,首先要介紹幾個重要的概念:函數
咱們首先要了解如下特性:學習
咱們用下面這幅圖來揭示裝飾者的結構:
this
下面給出一段代碼的例子:spa
js//共有超類 var org=function(){this.cost=0;}; org.prototype.getCost=function(){}; //組件 var component=function(num){this.cost=num;}; component.prototype=new org(); component.prototype.getCost=function(){return this.cost;}; //裝飾者 var decorator=function(component){ this.base=component; }; decorator.prototype=new org(); decorator.prototype.getCost=function(){ return this.base.getCost()+1.0; }; //裝飾過程 var exp=new component(1.0); var exp2=new decorator(exp); exp2.getCost();//2.0
這裏用js其實不大恰當,並不能很好地解釋裝飾者模式,之因此用js來講明,是想說裝飾者模式並不是僅僅限於oo語言的場合,對於動態語言,它依然大有用處。prototype
裝飾者適用各類行爲能夠大量組合起來,這種時候不使用裝飾者的話就不得不爲全部的組合狀況都定義一個類,這無疑是一個災難。使用裝飾者的話,就只用預先定義組合的元素,對於不一樣的組合方式,動態地實現要求的接口,顯然更加優越。設計
舉一個例子,賣電腦器材,以每一次交易爲一個對象,爲了計算出交易金額和記錄交易配件,若是使用繼承的話,須要列出全部器材的組合狀況,而使用裝飾者模式的話,就是把每一種器件都作成一個裝飾者。固然在這個例子裏面好像這也不是什麼好的解決方式,你能夠用一個列表來記錄所賣的全部器件,而後寫個函數遍歷列表計算。寫出這個例子也是爲了告訴咱們儘管不少地方可使用設計模式,但不要作設計模式驅動的開發,而是作設計原則驅動的開發。code