設計模式 之 裝飾者

2022-09-17 22:57:24 字數 2565 閱讀 5203

裝飾模式(deocrator)

動態地給乙個物件加入一些額外的職責。就新增功能來說,裝飾模式比生成子類更為靈活。

所謂裝飾,就是一些物件給主題物件做陪襯。

我們能夠想象,在乙個公司裡面。每乙個人都有乙個辦工作,辦工作都須要有電腦、**、目錄、盆栽、簽字筆、公章等作為裝飾。可是不同的人的辦公桌上的裝飾肯定不一樣。比方說,老總的辦公桌上應該什麼都有,可是一般工作人員的辦公桌上,就不應該有**和公章。

我們怎麼動態的來裝飾辦公桌呢?

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace 裝飾

private string username;

public officedesk(string username)

public virtual void show()

的辦公桌:",username );}}

//裝飾者

public class decorator : officedesk

public override void show()}}

//詳細裝飾類

//電腦

public class computer:decorator

}//**

public class telephone : decorator

}//目錄

public class file : decorator

}//盆栽

public class plant : decorator

}//簽字筆

public class pen : decorator

}//公章

裝飾者類圖:

在裝飾模式結構圖中包括例如以下幾個角色:

component(抽象構件):它是詳細構件和抽象裝飾類的共同父類,宣告了在詳細構件中實現的業務方法,它的引入能夠使client以一致的方式處理未被裝飾的物件以及裝飾之後的物件,實現client的透明操作。

concretecomponent(詳細構件):它是抽象構件類的子類,用於定義詳細的構件物件,實現了在抽象構件中宣告的方法,裝飾器能夠給它新增額外的職責(方法)。

decorator(抽象裝飾類):它也是抽象構件類的子類,用於給詳細構件新增職責,可是詳細職責在其子類中實現。它維護乙個指向抽象構件物件的引用,通過該引用能夠呼叫裝飾之前構件物件的方法。並通過其子類擴充套件該方法。以達到裝飾的目的。

concretedecorator(詳細裝飾類):它是抽象裝飾類的子類。負責向構件加入新的職責。

每個詳細裝飾類都定義了一些新的行為,它能夠呼叫在抽象裝飾類中定義的方法。並能夠新增新的方法用以擴充物件的行為。

主要長處:

1.對於擴充套件乙個物件的功能,裝飾模式比繼承更加靈活性,不會導致類的個數急劇新增。

2.能夠通過一種動態的方式來擴充套件乙個物件的功能,通過配置檔案能夠在執行時選擇不同的詳細裝飾類,從而實現不同的行為。

3.能夠對乙個物件進行多次裝飾。通過使用不同的詳細裝飾類以及這些裝飾類的排列組合。能夠創造出非常多不同行為的組合。得到功能更為強大的物件。

4.詳細構件類與詳細裝飾類能夠獨立變化,使用者能夠依據須要新增新的詳細構件類和詳細裝飾類。原有類庫**無須改變。符合「開閉原則」。

主要缺點:

1.使用裝飾模式進行系統設計時將產生非常多小物件。

2. 裝飾模式提供了一種比繼承更加靈活機動的解決方式。但同一時候也意味著比繼承更加易於出錯,排錯也非常困難,對於多次裝飾的物件,除錯時尋找錯誤可能須要逐級排查。較為繁瑣。

適用場景:

1.當我們須要為某個現有的物件動態地新增乙個新的功能或職責時,能夠考慮使用裝飾者。

2. 當不能採用繼承的方式對系統進行擴充套件或者採用繼承不利於系統擴充套件和維護時能夠使用裝飾模式。

與介面卡、策略的差別:

裝飾者是在不改變原內容的基礎上,動態地新增新的行為;

介面卡則主要用來填補兩個介面之間的差異,將乙個介面轉化為還有乙個介面;

策略是以切換運算法則的方式變換功能。

設計模式之 裝飾者模式

一 裝飾者模式 裝飾者模式又稱為包裝模式。動態地給乙個物件增加新的職責。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式顧名思義就是對乙個物件進行裝飾,具體怎樣裝飾呢?那就是給這個物件不斷的增加職責方法。給乙個物件增加方法不簡單啊,用繼承或者直接在物件的類中增加方法。如果我們要對自...

設計模式之裝飾者模式

此模式動態將職責附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更具彈性的代替方案,以一圖一概括。要點1 裝飾者和被裝飾物件有相同的超型別。2 可以用乙個或多個裝飾者包裝乙個物件。3 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。4 物件可以在任何時候被裝飾,所以可...

設計模式之裝飾者模式

public abstract class beverage 返回當前飲品的 public abstract double cost 為了讓condiment decorator 調料裝飾者 能夠取代beverage,所以將它擴充套件至beverage類 public abstract class ...