星空网 > 软件开发 > ASP.net

设计模式C#实现(十二)——装饰模式

 

      • 意图
      • 适用性
      • 结构
      • 实现
      • 效果
      • 参考

 

意图

动态的给一个对象添加一些额外的职责。

适用性

  • 动态的为单个对象添加职责而不影响其他对象
  • 处理那些可以撤销的职责(? 在某些功能不需要时删除这些功能)
  • 当不能采用生成子类的方法进行扩展时

结构

设计模式C#实现(十二)——装饰模式

实现

设计一些饮料,这些饮料可以由顾客选择添加各种佐料。
先是饮料的抽象类

 abstract class Beverage  {    protected string Description = "Unknown Beverage";    public virtual string GetDescription()    {      return Description;    }    public abstract double Cost();  }

接下来是具体的饮料类

 class Coffee:Beverage  {    public Coffee()    {      Description = "coffee";    }    override public double Cost()    {      return 1.99;    }  }

然后是装饰器的抽象类,它不仅继承了饮料的抽象,而且还它包含一个饮料成员

abstract class CondimentDecorator : Beverage  {    protected Beverage Beverage;    override public abstract string GetDescription();  }

最后是两个具体的装饰器

  class Milk:CondimentDecorator  {    public Milk(Beverage beverage)    {      this.Beverage = beverage;    }    override public string GetDescription()    {      return "Milk " + Beverage.GetDescription();    }    override public double Cost()    {      return .10 + Beverage.Cost();    }  }    class Mocha:CondimentDecorator  {    public Mocha(Beverage beverage)    {      this.Beverage = beverage;    }    override public string GetDescription()    {      return "Mocha " + Beverage.GetDescription();    }    override public double Cost()    {      return .20 + Beverage.Cost();    }  }

现在,顾客可以随意选择佐料了

  class Program  {    static void Main(string[] args)    {      Beverage beverage = new Coffee();      Console.WriteLine(beverage.GetDescription() + ": $" + beverage.Cost());      Beverage mocha = new Mocha(beverage);      Console.WriteLine(mocha.GetDescription() + ": $" + mocha.Cost());      Beverage milk = new Milk(beverage);      Console.WriteLine(milk.GetDescription() + ": $" + milk.Cost());      Beverage mochaMilk = new Milk(mocha);      Console.WriteLine(mochaMilk.GetDescription() + ": $" + mochaMilk.Cost());      Console.ReadKey();    }  }

运行结果
设计模式C#实现(十二)——装饰模式

效果

1.比静态继承灵活
2.避免在层次结构高层的类有太多的特征
3.装饰器与它装饰的对象不一样,使用时不能依赖对象表示
4.会产生许多小对象

参考

  1. 《Head First 设计模式
  2. 《设计模式》




原标题:设计模式C#实现(十二)——装饰模式

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

亚马逊FBA收费标准_Amazon的海外仓收费详解:https://www.goluckyvip.com/news/859.html
顺丰快递是什么:https://www.goluckyvip.com/news/8590.html
sfexpress是什么快递:https://www.goluckyvip.com/news/8591.html
EMS快递是什么:https://www.goluckyvip.com/news/8592.html
dhl快递是什么:https://www.goluckyvip.com/news/8593.html
FEDEX快递是什么:https://www.goluckyvip.com/news/8594.html
TikTok斥资210万美元游说美国参议院阻止法案通过 :https://www.goluckyvip.com/news/188220.html
北京飞机票查询(快速查询北京至各地机票价格和航班信息):https://www.vstour.cn/a/366178.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流