首頁 » 設計模式 » 裝飾器(Decorator)

裝飾器(Decorator)

作者:

分類:

裝飾器(Decorator)

概念

裝飾器模式是一種結構型模式,常用於包裝已定型的類別(與配接器模式同樣又稱Wrapper),在不需要更動核心程式碼的狀況下將類別包一層殼,使其能比原有的類別方法附加了其他功能。

裝飾器模式的架構相對其他模式較為固定,透過繼承相同的介面來維持相同的物件階層,使用起來像是在杯子裡倒入各種不同的飲料。

正好最近喜歡在家調酒,今天就來嘗試調一杯馬丁尼吧!來看看下面範例。

範例

//**************
//* author: cian
//* 20231020
//**************

interface ICocktail
{
    string GetIngredients();
}

/* 馬丁尼 */
class Martini : ICocktail
{
    public string GetIngredients()
    {
        return $"Martini:";
    }
}

/* 裝飾器: 雞尾酒材料 */
abstract class CocktailDecorator : ICocktail
{
    private readonly ICocktail decoratedCocktail;
    
    public CocktailDecorator(ICocktail _cocktail) 
    { 
        decoratedCocktail = _cocktail;
    }

    public virtual string GetIngredients()
    {
        return decoratedCocktail.GetIngredients();
    }
}

/* 琴酒 */
class AddGin : CocktailDecorator
{
    public AddGin(ICocktail _cocktail) : base(_cocktail) {}
    
    public override string GetIngredients()
    {
        return base.GetIngredients() + " Gin";
    }
}

/* 乾香(苦)艾酒 */
class AddDryVermouth : CocktailDecorator
{
    public AddDryVermouth(ICocktail _cocktail) : base(_cocktail) {}
    
    public override string GetIngredients()
    {
        return base.GetIngredients() + " Dry Vermouth";
    }
}

class MainApp
{
    static void Main(string[] args)
    {
        //最近喜歡在家調酒,就來試試看吧。
        //來做一杯馬丁尼
        ICocktail martini = new Martini("Martini"); 
        martini = new AddGin(martini);
        martini = new AddDryVermouth(martini);
        
        ConsoleWriteLine(martini.GetIngredients());
        //OUTPUT: Martini: Gin Dry Vermouth
    }
}

結語

以上為學習過程的紀錄
如果文章有誤,歡迎前輩留言請不吝指教。

「cian」的個人頭像

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *