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.

  • 相关阅读:
    招聘.Net中高级软件研发工程师
    布局和救火
    UITableView详解(转)
    iOS开发那些事--性能优化–内存泄露问题的解决(转)
    LeeCode(PHP) 2.add-two-numbers
    LeeCode(PHP) 1.Two Sum
    PHP实现 序列帧拆分
    PHPExcel导出大量数据超时及内存错误解决方法(转)
    laravel路由 实现短连接生成及跳转(php 301重定向)
    从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续(面试题)
  • 原文地址:https://www.cnblogs.com/edmundli/p/2100629.html
Copyright © 2011-2022 走看看