設計模式之裝飾(decorator)

2021-08-29 13:34:19 字數 1170 閱讀 2808

裝飾模式(decorator pattern):

裝飾模式使用原來被裝飾的類的乙個子類的例項,把客戶端的呼叫委派到被裝飾類。裝飾模式的關鍵在於這種擴充套件是完全透明的。

裝飾模式中的各個角色:

抽象構件(component)角色:給出乙個抽象介面,以規範準備接收附加責任的物件。

具體構件(concrete component)角色:定義乙個將要接收附加責任的類。

(抽象)裝飾(decorator)角色:持有乙個構件物件的例項,並定義乙個與抽象構件介面一致的介面。介面的實現方法值得注意,每乙個實現的方法都委派給父類,但並不單純地委派,而是有功能的增強。

by kyo:(抽象)裝飾角色應不提供預設的建構函式,以迫使子類呼叫其帶參的建構函式並傳入相應的具體元件物件。

具體裝飾(concrte decorator)角色:負責給構件物件 「貼上」 附加的責任。每個具體裝飾角色都實現規定的方法,在規定的方法中呼叫其父類的此方法並新增自己的附加**。

在以下情況下應當使用裝飾模式:

1。需要擴充套件乙個類的功能,或給乙個類增加附加責任。

2。需要動態地給乙個物件增加功能,這些功能可以再動態的撤銷。

3。[color=orange]需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關係變得不現實。[/color]

by kyo:裝飾模式應該發盡量使用在無發生次序要求(無狀態)的物件中。

使用裝飾模式主要有以下優點:

1。裝飾模式與繼承關係的目的都是要擴充套件物件的功能,但是裝飾模式可以提供比繼承更多的靈活性。

裝飾模式允許系統動態地決定「帖上」乙個需要的「裝飾」,或者除掉乙個不需要的「裝飾」。繼承關係則不同,繼承關係是靜態的,它在系統執行前就決定了。

2。通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。而繼承關係則沒有這個優勢,每一種不同的排列組合均需要事先通過子類的繼承方式設計好。

3。使用裝飾模式,可以比使用繼承關係需要較少數目的類。使設計比較易於進行。但另一方面,使用裝飾模式會產生比使用繼承關係更多的的物件,比較難以控制(裝飾模式的動態性較強)。

使用裝飾模式主要的缺點:

這種比繼承方式更加靈活機動的特性,意味著裝飾模式比繼承更加易於出錯。

介面卡模式的用意是要改變所考慮的物件的介面而不一定改變物件的效能(特性),而裝飾模式的用意是要保持介面,從而增強所考慮物件的效能(特性)。

23種設計模式之裝飾模式(Decorator)

裝飾模式是一種物件結構型模式,可動態地給乙個物件增加一些額外的職責,就增加物件功能來說,裝飾模式比生成子類實現更為靈活。通過裝飾模式,可以在不影響其他物件的情況下,以動態 透明的方式給單個物件新增職責 當需要動態地給乙個物件增加功能,這些功能可以再動態地被撤銷時可使用裝飾模式 當不能採用生成子類的方...

設計模式學習之裝飾者模式(Decorator)

作用 假設我們有乙個使用了八個物件的程式,由於需求變更,其中三個物件需要另外乙個屬性。讀者可以為這三個物件建立乙個派生類,在多數情況下,這是乙個完全可以接受的方案。然而,如果這三個物件中的每個物件都要求有不同的屬性,這就意味著要建立三個派生類。更進一步,如果其中乙個類具有其他兩個類中的屬性,可能就要...

設計模式攻略 結構型模式之Decorator模式

概要 又是一種比較常見也比較常用的模式。系統模組經常需要進行功能上的擴充套件,比如下面這種形式的結構,當需要擴充套件新function時,通常會通過繼承追加新類來實現功能的擴充套件。但是如果我們不是擴充套件乙個新功能的物件,而只是對 所有現有的每種功能類的處理進行擴充套件時,我們應該怎麼做?deco...