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.

  • 相关阅读:
    mount 需要同时设置 noatime 和 nodiratime 吗?
    xfsdump命令使用
    查看linux设备文件系统类型的方法
    Elasticstack 5.1.2 集群日志系统部署及实践
    Kickstart无人值守安装[转载]
    mytop安装,使用mytop监控MySQL性能
    使用Anemometer分析MySQL慢查询记录
    (总结)Web性能压力测试工具之WebBench详解
    mysqlsla快速入门
    Linux下MySQL慢查询分析mysqlsla安装使用
  • 原文地址:https://www.cnblogs.com/edmundli/p/2100629.html
Copyright © 2011-2022 走看看