二十三種設計模式之裝飾者模式

2021-09-28 10:19:52 字數 2976 閱讀 5277

1、什麼是裝飾者模式

裝飾模式是在不使用繼承和不改變原類檔案的情況下,動態的擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。

1,不改變原類檔案。

2,不使用繼承。

3,動態擴充套件。

2、裝飾模式的優點

在講優點之間,我們知道乙個類的功能擴充套件我們可以通過繼承的方式重寫父類的方法來達到增強功能。那我們來看下這兩種方式。

(1) 類的繼承 ( 高耦合,會產生更多的子類,從而引起類的** )

(2) 物件組合即裝飾模式 ( 降耦,不會創造更多的子類 ) 動態的為物件新增功能) 所以類應該對擴充套件開放,對修改關閉 。

那麼總結下裝飾者優點:

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

2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。

3、裝飾者特點

(1) 裝飾物件和真實物件有相同的介面。這樣客戶端物件就能以和真實物件相同的方式和裝飾物件互動。

(2) 裝飾物件包含乙個真實物件的引用(reference)

(3) 裝飾物件接受所有來自客戶端的請求。它把這些請求**給真實的物件。

(4) 裝飾物件可以在**這些請求以前或以後增加一些附加功能。這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。

4、參與者

1) component(抽象元件又叫被裝飾物件的基類)

定義乙個物件介面,可以給這些物件動態地新增職責。

2) concretecomponent(具體元件又叫具體被裝飾物件)

定義乙個物件,可以給這個物件新增一些職責。

3) decorator(裝飾者抽象類)

維持乙個指向component例項的引用,並定義乙個與component介面一致的介面。

4)concretedecorator(具體裝飾者)

具體的裝飾物件,給內部持有的具體被裝飾物件,增加具體的職責。

5、案例

下面舉乙個案例。

抽象元件

package com.wmy.designpattern.decoratorpattern;/*** @program: design pattern* @description:* @author: wmy**/public inte***ce person
具體元件

package com.wmy.designpattern.decoratorpattern;/*** @program: design pattern* @description: 具體元件* @author: wmy**/public class man implements person}
抽象裝飾者

package com.wmy.designpattern.decoratorpattern;/*** @program: design pattern* @description: 抽象裝飾者* @author: wmy**/public abstract class decorator implements personpublic void eat()}
具體裝飾者a

package com.wmy.designpattern.decoratorpattern;/*** @program: design pattern* @description: 具體裝飾者a* @author: wmy**/public class mandecoratora extends decoratorpublic void reeat()}
具體裝飾者a

package com.wmy.designpattern.decoratorpattern;/*** @program: design pattern* @description: 具體裝飾者b* @author: wmy**/public class mandecoratorb extends decorator}
測試類

package com.wmy.designpattern.decoratorpattern;/*** @program: design pattern* @description: 測試類* @author: wmy**/public class test}
6、總結

oo原則:動態地將責任附加到物件上。想要擴充套件功能, 裝飾者提供有別於繼承的另一種選擇。

二十三種設計模式之建造者模式四

建造者模式的思想.就是我需要乙個物件,我不用建立,我去找建築商,然後我告訴建築商我要的物件都有哪些屬性,建築商它也不建立物件,建築商去找乙個或一些能建立和賦值的工人來幹,由建築商負責指揮工人先怎麼樣,再怎麼樣,最後將物件給我 實體類package ink.yql.builder 需要被建立的類 pu...

二十三種設計模式之組合模式

組合模式 將物件聚合成樹形結構來表現 整體 部分 的層次結構。組合模式能讓客戶以一致的方式來處理個別物件以及物件組合。也就是我們可以忽略物件組合與個體之間的差別。應用場景 餐廳合併列印主選單 子選單 public abstract class menucomponent public string ...

二十三種設計模式之工廠模式

工廠模式的核心 例項化物件 原因 有些物件不能直接例項化,比如介面 抽象類及複雜物件的其他依賴 核心 呼叫工廠class的靜態方法例項化物件 以日誌為例 public class staticfactory 核心 先建立工廠物件,之後呼叫工廠方法 例項化工廠模式 public class insta...