裝飾器模式(decorator pattern):允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
裝飾者模式適用場景:(1
)以動態的方式給物件新增職責。(2
)處理那些可以撤銷的職責。(3
)當採用生成子類的方法進行擴充時,可能有大量獨立的擴充套件,為支援每一種組合將產生大量的子類,使得子類數目呈**性增長。
(1)抽象元件(component):給出乙個抽象介面,以規範準備接受附加責任的物件。
(2)被裝飾者(concretecomponent):component的具體實現,也就是我們要裝飾的具體物件。
(3)裝飾者元件(decorator):持有元件物件的例項引用,該類的職責就是為了裝飾具體元件物件,定義的基類。
(4)具體裝飾(concretedecorator):負責給構件物件裝飾附加的功能。
裝飾者模式實現步驟:
1.增強類與被增強類實現同一介面
2.增強類裡面得到被增強類的引用(只要在增強類裡面傳入被增強類物件的一定就是裝飾者模式)
3.對於不需要改寫的方法,呼叫被增強類原有方法,對應需要改寫增強的方法寫自己的邏輯
下面就以一杯奶茶說起,我最喜歡喝大杯阿水茶的珍珠奶茶,可是有時候也會不滿足奶茶只有珍珠,在天氣熱的時候我還要加冰塊,心情好的時候再加個椰果等,這些其實都是對奶茶的拓展即裝飾。
我們先
來建立乙個奶茶的抽象類,
相當於component
class milk_tea;};
再寫乙個珍珠奶茶類,相當於被裝飾者
class milk_tea;};
然後實現裝飾類:
class decorator:public milk_tea
virtual void request()
};分別寫出不同裝飾具體類:
class add1:public decorator
void request()
void add_ice()
};class add2:public decorator
void request()
void add_fruit()
};客戶端:
int main()
效果:
優點:
1、目的在於擴充套件物件的功能。裝飾者模式提供比繼承更好的靈活性。裝飾是動態的,執行時可以修改的;繼承是靜態的,編譯期便已確定好。
2、通過使用不同的裝飾類及對他們的排列組合,可以創造出許多不同行為的組合。
缺點:1、
產生很多的小物件,大量的小物件會占用記憶體。2、
組合方式很多,很容易出錯。
c 之裝飾模式
裝飾模式屬於結構型模式,所謂裝飾,即修飾的意思。定義 動態的給乙個物件新增一些額外的職責 優點 對於增加功能而言,裝飾模式比生產子類更加靈活。何時使用 在不改變原來的類和關係的情況下,動態地擴充套件這個類物件所具有的功能,當然也支援撤銷新增的功能。優點 裝飾模式與繼承的目的都是擴充套件物件的功能,但...
c 設計模式之裝飾模式
裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該盡量使用物件組合,而不是物件繼承來擴充套件和復用...
C 設計模式之裝飾模式
動態地給乙個物件增加一些額外的職責,就增加物件的功能來說,裝飾模式比生成子類更為靈活。裝飾模式是一種物件結構模式。我們常常通過繼承的方式來對乙個既有的類進行功能新增,但繼承方式有顯著的侷限性,因為 例如在視窗控制項當中,要增加新的功能如增加滾動條,增加背景,通過繼承的方式來增加新的功能,有下面的解決...