設(shè)計模式之裝飾者模式

本文將深入學(xué)習(xí)設(shè)計模式中的裝飾者模式。
定義
再不改變原有對象的基礎(chǔ)之上,將功能附加到對象上。提供了比繼承更有彈性的替代方案(擴展原有對象功能)。
類型
結(jié)構(gòu)型
適用場景
1、擴展一個類的功能或者給一個類添加附加職責(zé)。
2、給一個對象動態(tài)添加功能,或者動態(tài)撤銷功能。
優(yōu)點
1、是繼承關(guān)系的有力補充,比繼承靈活,在不改變原有對象的情況下給一個對象擴展功能。(繼承在擴展功能上是靜態(tài)的,必須在編譯時就確定好,而使用裝飾者沒事可以在運行時決定,裝飾者也建立在繼承基礎(chǔ)之上的)
2、通過使用不同裝飾類以及這些類的組合排列關(guān)系,可以實現(xiàn)不同的效果。
3、符合開閉原則。
缺點
1、會出現(xiàn)更多的代碼,更多的類,增加程序的復(fù)雜性。
2、動態(tài)裝飾時,多層裝飾會更復(fù)雜。(使用繼承類擴展功能會增加類的數(shù)量,使用裝飾者模式不會像繼承那樣增加那么多類的數(shù)量但是會增加對象的數(shù)量,當(dāng)對象的數(shù)量增加到一定的級別時,無疑會大大增加我們代碼調(diào)試的難度)。
裝飾者相關(guān)的設(shè)計模式
裝飾者和代理模式
裝飾者模式關(guān)注的是對象的動態(tài)添加功能。代理模式關(guān)注的是對對象的控制訪問,對它的用戶隱藏對象的具體信息。
裝飾者模式和適配器模式
裝飾者模式和被裝飾的類要實現(xiàn)同一接口,或者裝飾類是被裝飾的類的子類。適配器模式和被適配的類具有不同的接口。
使用場景
煎餅果子。
煎餅果子一般的話都是可以加雞蛋加香腸什么的,好那我們就來模擬一下加在煎餅果子上加?xùn)|西的操作。
首先我們看一下使用繼承的方式怎么實現(xiàn)。
創(chuàng)建一個煎餅果子類

加雞蛋類,我們讓加雞蛋類繼承煎餅果子類

加香腸類,同樣的繼承煎餅果子類。

測試類

這樣做有個問題,假設(shè)我們現(xiàn)在要加2個雞蛋呢?我們沒有寫加兩個雞蛋的類,如果還有3個4個什么的那是不是還要重寫這樣的類?下面我們使用裝飾者模式實現(xiàn)以下。
首先我們定義一個抽象的煎餅果子

實體煎餅果子類,實體煎餅果子繼承了抽象煎餅果子類。

裝飾父類,這里也是可以使用抽象類,等會兒我們再說什么時候使用抽象類什么時候使用實體類。注意構(gòu)造器和這個里面的花費,描述方法的寫法。這里注入一個抽象煎餅類的對象。我們的獲取描述花費的操作都委托抽象煎餅類來執(zhí)行,為什么要這么做可以去看看我們之前的文章依賴倒置原則。

雞蛋裝飾類,這里注意他的構(gòu)造器,參數(shù)是父類的對象抽象煎餅類對象,這里獲取描述和花費方法都是調(diào)用父類的方法。

香腸裝飾類:

測試類:

輸出結(jié)果:

最后我們說說裝飾父類什么時候使用抽象類。一般當(dāng)我們需要在具體的類中都需要執(zhí)行一些特定的操作時。我們一般都會使用抽象類,并定義抽象方法。
