코딩 공부/디자인패턴

데코레이터 패턴

공부를 함 2024. 12. 3. 16:43

Decorator Pattern

#region Base
public abstract class Beverage
{
    public string Description { get; set; }
    public abstract double Cost();
}

public abstract class CondimentDecorator : Beverage
{
    protected Beverage beverage;
}
#endregion

#region Baverage
public class Espresso : Beverage
{
    public Espresso() { Description = "Espresso"; }
    public override double Cost() { return 1.99; }
}

public class HouseBlend : Beverage
{
    public HouseBlend() { Description = "House Blend"; }
    public override double Cost() { return 0.89; }
}
#endregion

#region CondimentDecorator
public class Mocha : CondimentDecorator
{
    public Mocha(Beverage beverage) { this.beverage = beverage; Description = beverage.Description + ", Mocha"; }
    public override double Cost() { return 0.20 + beverage.Cost(); }
}

public class Soy : CondimentDecorator
{
    public Soy(Beverage beverage) { this.beverage = beverage; Description = beverage.Description + ", Soy"; }
    public override double Cost() { return 0.15 + beverage.Cost(); }
}

public class Whip : CondimentDecorator
{
    public Whip(Beverage beverage) { this.beverage = beverage; Description = beverage.Description + ", Whip"; }
    public override double Cost() { return 0.10 + beverage.Cost(); }
}
#endregion

public class StarbuzzCoffee
{
    public static void Main(string[] args)
    {
        Beverage beverage = new Espresso();
        Console.WriteLine($"{beverage.Description} costs ${beverage.Cost():F2}");
        
        Beverage beverage2 = new HouseBlend();
        beverage2 = new Mocha(beverage2);
        beverage2 = new Mocha(beverage2);
        beverage2 = new Whip(beverage2);
        Console.WriteLine($"{beverage2.Description} costs ${beverage2.Cost():F2}");
    }
}