Decorator デザインパターンの実装

# 模擬カフェテリア

Decorator は、構造設計パターンの 1 つです。オブジェクトの動作を追加、削除、または変更するために使用されます。このドキュメントでは、Decorator DP を適切に使用する方法を説明します。

簡単な例でその考え方を説明しましょう。あなたが今、有名なコーヒー会社のスターボブスにいると想像してみてください。クリームと砂糖、クリームとトッピングなど、お好きなコーヒーを注文できます。しかし、すべての飲み物のベースはコーヒーです - 暗くて苦い飲み物は、あなたが変更することができます.コーヒーマシンをシミュレートする簡単なプログラムを書きましょう.

まず、基本ドリンクを記述するクラスを作成して抽象化する必要があります:

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());

    }
}

コードを実行すると、次の出力が生成されます:

ミルクと砂糖をトッピングしたコーヒー

# コメント

Decorator を使用する利点:

  • さまざまな構成で実行時に新しい機能を追加できます
  • 継承の良い代替手段
  • クライアントは使用したい構成を選択できます