JS設計模式之裝飾者模式

2021-06-18 19:16:56 字數 2573 閱讀 7663

裝飾者模式就是透明把物件包裝在具有同樣介面的另一物件中。相對於建立子類來說,裝飾者是一種友好的選擇。

裝飾者用於給物件增加功能,可以創造大量的子類。

例如:

function extend(subclass, superclass);

f.prototype = superclass.prototype;

subclass.prototype = new f();

subclass.prototype.constructor = subclass;

subclass.superclass = superclass.prototype;

if(superclass.prototype.constructor == object.prototype.constructor)

}//組建類 基類

function bicycle(){}

bicycle.prototype = ,

wash:function(){},

ride:function(){},

repair:function(){},

getprice:function()

};//裝飾者類 實現與組建類同樣的介面

var bicycledecorator = function(bicycle)

bicycledecorator.prototype = ,

wash:function(),

ride:function(),

repair:function(),

getprice:function()

};//我們需要有兩車燈的自行車

var headlightbicycle = function(bicycle)

extend(headlightbicycle, bicycledecorator);

headlightbicycle.prototype.assemble = function()

headlightbicycle.prototype.getprice = function()

//我們需要有乙個鈴鐺的自行車

var basketbicycle = function(bicycle)

extend(basketbicycle, bicycledecorator);

basketbicycle.prototype.assemble = function()

basketbicycle.prototype.getprice = function()

//擁有兩個車燈的自行車

var bicycle = new bicycle();

alert(bicycle.getprice());

var mybicycle1 = new headlightbicycle(bicycle);

alert(mybicycle1.assemble());

alert(mybicycle1.getprice());

//在兩個車燈的前提下,增加乙個鈴鐺

var mybicycle2 = new basketbicycle(mybicycle1);

alert(mybicycle2.assemble());

alert(mybicycle2.getprice());

我們可以動態的應用裝飾者,創造出具有特性的物件。

裝飾者介面的角色:

1、說明裝飾者必須實現的方法。

2、裝飾者物件與組建能夠互換使用。

裝飾者模式與組合模式的比較:

1、都是用來包裝物件,在組合模式中稱之為子物件,裝飾者模式中稱之為元件。

2、組合模式是一種結構模式,用於將眾多子物件組織為乙個整體,將大批物件當作乙個整體物件處理,作為乙個組織層次結構的樹,不會修改方法的呼叫,而是將組合物件沿著子物件鏈向下傳遞,最終落在葉物件中。

3、裝飾者模式是結構型模式,不是用於組織物件,而是在不修改現有物件的前提下為其增加新的職責。目的是用於對方法的修改。組合物件不修改方法呼叫,目的是在於子物件。然而裝飾者是修改方法,子物件只能有乙個。

裝飾者修改組建的方式

1、方法之後新增行為

先呼叫元件的方法,然後在實施附加的方法。

2、在方法之前新增行為

修改行為放生在執行元件之前。

3、替換方法

對方法進行整體替換,元件的方法將不會被呼叫。需注意的是這個裝飾者的順序至少要放到其餘同樣方法後應用。

4、新增新方法

工廠模式適合建立裝飾對像。

函式裝飾者

function uppercasedecorator(func)

}function getdate()

getdatecaps = uppercasedecorator(getdate);

alert(getdate());

alert(getdatecaps());

這樣 uppercasedecorator也是對getdate函式的裝飾

適用場合

為類新增特性與職責,如果派生子類不實際的話,就要用到裝飾者模式。

為物件新增特性,而不想修改物件,用到裝飾者模式。

JS設計模式 裝飾者模式

昨天又學了白賀翔老師的js設計模式 裝飾者模式,下面來分享一下它的實現哈。裝飾者模式 就是在保證不改變原始物件的基礎上,新增新的方法或請求.裝飾者模式兩個要求 1.實現同一批介面 2.需要含有子類 介面類的實現 var carinte ce new bh.inte ce carinte ce get...

js設計模式 裝飾者模式

裝飾者模式可以動態地給乙個物件新增一些額外的職責。就增加功能來說,裝飾者模式比通過繼承生成子類更為靈活。下面通過乙個例子來詳細的介紹一下。我們銷售一台電腦,每個電腦都是乙個新的computer物件,它都有乙個price屬性來表示 並且可以通過它的getprice方法來得到它的 var compute...

JS設計模式 裝飾者模式

裝飾者模式 在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件 1 裝飾物件和真實物件有同樣的介面。這樣client物件就能以和真實物件同樣的方式和裝飾物件互動。2 裝飾物件包括乙個真實物件的引用 reference 3 裝飾物件...