zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    C# 枚举常用工具方法
    AppBox_v3.0
    DDD:四色原型中Role的 “六” 种实现方式和PHP的Swoole扩展
    MySql主从配置实践及其优势浅谈
    ActionInvoker
    【Oracle】-【体系结构】-【DBWR】-DBWR进程相关理解
    Linux MySQL单实例源码编译安装5.6
    窗口嵌入到另一个窗口(VC和QT都有)
    Window下 Qt 编译MySQL驱动(居然用到了动态库格式转换工具,需要将C:/MySQL/lib目录下的libmySQL.dll文件复制到我们Qt Creator安装目录下的qt/bin目录中)good
    在Linux下使用iconv转换字符串编码
  • 原文地址:https://www.cnblogs.com/edmundli/p/2100629.html
Copyright © 2011-2022 走看看