模擬自助餐廳

裝飾器是結構設計模式之一。它用於新增,刪除或更改物件的行為。本文件將教你如何正確使用 Decorator DP。

讓我通過一個簡單的例子向你解釋它的想法。想象一下,你現在在著名的咖啡公司 Starbobs。你可以訂購任何你想要的咖啡 - 奶油和糖,奶油和餡料以及更多組合! 但是,所有飲料的基礎是咖啡 - 黑暗,苦酒,你可以修改。讓我們寫一個模擬咖啡機的簡單程式。

首先,我們需要建立和抽象描述我們的基礎飲料的類:

public abstract class AbstractCoffee
{
    protected AbstractCoffee k = null;

    public AbstractCoffee(AbstractCoffee k)
    {
        this.k = k;
    }

    public abstract string ShowCoffee();
}

現在,讓我們創造一些額外的東西,比如糖,牛奶和澆頭。建立的類必須實現 AbstractCoffee - 它們將裝飾它:

public class Milk : AbstractCoffee
{
    public Milk(AbstractCoffee c) : base(c) { }
    public override string ShowCoffee()
    {
        if (k != null)
            return k.ShowCoffee() + " with Milk";
        else return "Milk";
    }
}
public class Sugar : AbstractCoffee
{
    public Sugar(AbstractCoffee c) : base(c) { }

    public override string ShowCoffee()
    {
        if (k != null) return k.ShowCoffee() + " with Sugar";
        else return "Sugar";
    }
}
public class Topping : AbstractCoffee
{
    public Topping(AbstractCoffee c) : base(c) { }

    public override string ShowCoffee()
    {
        if (k != null) return k.ShowCoffee() + " with Topping";
        else return "Topping";
    }
}

現在我們可以製作我們最喜歡的咖啡

public class Program
{
    public static void Main(string[] args)
    {
        AbstractCoffee coffee = null; //we cant create instance of abstract class
        coffee = new Topping(coffee); //passing null
        coffee = new Sugar(coffee); //passing topping instance
        coffee = new Milk(coffee);  //passing sugar
        Console.WriteLine("Coffee with " + coffee.ShowCoffee());

    }
}

執行程式碼將產生以下輸出:

與頂部的咖啡用糖用牛奶