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

2018-06-23 22:58:39来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

 

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

 

意图

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

适用性

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

结构

装饰器模式UML

实现

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

 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();
        }
    }

运行结果
运行结果

效果

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

参考

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:C#方法的练习

下一篇:无法嵌入互操作类型 *。请改用适用的接口。