1. ホーム
  2. decorator

[解決済み] 実例で理解する「Decoratorパターン」【終了しました

2022-04-21 13:44:44

質問

を勉強していました。 デコレータパターン で説明されているように ゴフ .

を理解する手助けをしてください。 デコレーターパターン . 誰か、これが実世界で役に立つユースケースをあげてくれませんか?

どのように解決するのですか?

<ブロッククオート

Decoratorパターンは、動的な追加という一つの目的を達成する。 を任意のオブジェクトに追加することができます。

ピザ屋さんの場合を考えてみましょう。ピザ屋では、数種類のピザを販売し、メニューにはトッピングも用意されるでしょう。ここで、ピザ屋がピザとトッピングの組み合わせごとに価格を提示しなければならない状況を想像してみましょう。4種類の基本的なピザと8種類のトッピングがあったとしても、ピザとトッピングのこれらすべての具体的な組み合わせを維持するために、アプリケーションは狂ってしまうでしょう。

ここで、デコレーターパターンの登場です。

デコレーターパターンでは、トッピングをデコレーターとして実装し、そのトッピングのデコレーターによってピザが装飾されます。最終的な請求額は、ベースとなるピザと、追加で注文したトッピングで構成されます。各トッピング担当者は、自分がデコレーションしているピザとその価格を知っています。 GetPrice() メソッドは、ピザとトッピングの両方の累積価格を返す。

EDIT

上記の説明のコード例です。

public abstract class BasePizza
{
    protected double myPrice;

    public virtual double GetPrice()
    {
        return this.myPrice;
    }
}

public abstract class ToppingsDecorator : BasePizza
{
    protected BasePizza pizza;
    public ToppingsDecorator(BasePizza pizzaToDecorate)
    {
        this.pizza = pizzaToDecorate;
    }

    public override double GetPrice()
    {
        return (this.pizza.GetPrice() + this.myPrice);
    }
}

class Program
{
    [STAThread]
    static void Main()
    {
        //Client-code
        Margherita pizza = new Margherita();
        Console.WriteLine("Plain Margherita: " + pizza.GetPrice().ToString());

        ExtraCheeseTopping moreCheese = new ExtraCheeseTopping(pizza);
        ExtraCheeseTopping someMoreCheese = new ExtraCheeseTopping(moreCheese);
        Console.WriteLine("Plain Margherita with double extra cheese: " + someMoreCheese.GetPrice().ToString());

        MushroomTopping moreMushroom = new MushroomTopping(someMoreCheese);
        Console.WriteLine("Plain Margherita with double extra cheese with mushroom: " + moreMushroom.GetPrice().ToString());

        JalapenoTopping moreJalapeno = new JalapenoTopping(moreMushroom);
        Console.WriteLine("Plain Margherita with double extra cheese with mushroom with Jalapeno: " + moreJalapeno.GetPrice().ToString());

        Console.ReadLine();
    }
}

public class Margherita : BasePizza
{
    public Margherita()
    {
        this.myPrice = 6.99;
    }
}

public class Gourmet : BasePizza
{
    public Gourmet()
    {
        this.myPrice = 7.49;
    }
}

public class ExtraCheeseTopping : ToppingsDecorator
{
    public ExtraCheeseTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    {
        this.myPrice = 0.99;
    }
}

public class MushroomTopping : ToppingsDecorator
{
    public MushroomTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    {
        this.myPrice = 1.49;
    }
}

public class JalapenoTopping : ToppingsDecorator
{
    public JalapenoTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    {
        this.myPrice = 1.49;
    }
}