• Decorator Pattern


    Time for Decorator pattern:

    Decorator UML

    Use Espresso, DarkRoast and HouseBlend coffee as the ConcreteComponent, Soy, Mocha and Whip as the ConcreteDecorate.

    Here is the code:

    using System;

    namespace DecoratorPattern
    {
    class Program
    {
    static void Main(string[] args)
    {
    Beverage beverage
    = new Espresso();
    Console.WriteLine(beverage.GetDescription()
    + " $" + beverage.Cost());

    Beverage beverage2
    = new HouseBlend();
    beverage2
    = new Mocha(beverage2);
    Console.WriteLine(beverage2.GetDescription()
    + " $" + beverage2.Cost());

    Beverage beverage3
    = new DarkRoast();
    beverage3
    = new Whip(beverage3);
    beverage3
    = new Soy(beverage3);
    beverage3
    = new Soy(beverage3);
    Console.WriteLine(beverage3.GetDescription()
    + " $" + beverage3.Cost());

    Beverage beverage4
    = new Espresso();
    beverage4
    = new Soy(beverage4);
    Console.WriteLine(beverage4.GetDescription()
    + " $" + beverage4.Cost());
    }
    }
    }

    namespace DecoratorPattern
    {
    public abstract class Beverage
    {
    protected string description = "Unknown beverage";
    public virtual string GetDescription()
    {
    return description;
    }

    public abstract double Cost();

    }
    }

    namespace DecoratorPattern
    {
    public abstract class CondimentDecorator : Beverage
    {
    }
    }
    namespace DecoratorPattern
    {
    public class Espresso: Beverage
    {
    Beverage beverage;
    public Espresso()
    {
    description
    = "Espresso";
    }

    public override double Cost()
    {
    return 2.11;
    }
    }
    }
    namespace DecoratorPattern
    {
    public class DarkRoast:Beverage
    {
    public DarkRoast()
    {
    description
    = "DarkRoast";
    }
    public override double Cost()
    {
    return .11;
    }
    }
    }
    namespace DecoratorPattern
    {
    public class HouseBlend:Beverage
    {
    public HouseBlend()
    {
    description
    = "HouseBlend";
    }
    public override double Cost()
    {
    return .99;
    }
    }
    }

    namespace DecoratorPattern
    {
    public class Whip:Beverage
    {
    Beverage beverage;
    public Whip(Beverage beverage)
    {
    this.beverage = beverage;
    }
    public override string GetDescription()
    {
    return beverage.GetDescription() + ", Whip";
    }
    public override double Cost()
    {
    return beverage.Cost() + .11;
    }

    }
    }

    namespace DecoratorPattern
    {
    public class Soy:Beverage
    {
    Beverage beverage;
    public Soy(Beverage beverage)
    {
    this.beverage = beverage;
    }
    public override string GetDescription()
    {
    return beverage.GetDescription() + ", Soy ";
    }
    public override double Cost()
    {
    return beverage.Cost() + .33;
    }
    }
    }

    namespace DecoratorPattern
    {
    public class Mocha:CondimentDecorator
    {
    Beverage beverage;
    public Mocha(Beverage beverage)
    {
    this.beverage = beverage;
    }
    public override string GetDescription()
    {
    return beverage.GetDescription() + ", Mocha ";
    }
    public override double Cost()
    {
    return beverage.Cost() + .02;
    }
    }
    }

    The diagram from here.

    You can find the details of the decription from Head First Design Patterns.

  • 相关阅读:
    第0课
    学前班-怎么看原理图
    LCD-裸机韦东山
    学前班
    专题8-Linux系统调用
    专题4-嵌入式文件系统
    网络编程 之 软件开发架构,OSI七层协议
    反射、元类,和项目生命周期
    多态、魔法函数、和一些方法的实现原理
    封装,接口,抽象
  • 原文地址:https://www.cnblogs.com/edmundli/p/2100629.html
Copyright © 2020-2023  润新知