标签:esc 撤销 优点 crete eve 分享 委托 系统 mil
装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生成子类可以更灵活地增加功能。
下面我们以星巴兹咖啡订单管理系统 管理、计算各种饮料的售价为例,对装饰者模式展开讨论。
可能我们的第一印象就是继承。
当然我们也可把调料都写在作为超类Beverage里,但是这样的话会造成数据的大量冗余,这是一个解决办法,但是还不够好。
装饰者模式的特点,一个ConcreteComponent可以被任意个ConcreteDecorator装饰。
结合实例就来解释,一种咖啡可以和任意种调料搭配。
下面就是我C#实现的代码:
/// <summary>
/// 饮品
/// </summary>
public abstract class Beverage
{
    /// <summary>
    /// 描述
    /// </summary>
    /// <returns></returns>
    public abstract string GetDescription();
    /// <summary>
    /// 定价
    /// </summary>
    /// <returns></returns>
    public abstract double Cost();
}
/// <summary>
/// 焦烤咖啡
/// </summary>
public class DarkRoast : Beverage
{
    public override double Cost()
    {
        return 2.5;
    }
    public override string GetDescription()
    {
        return "我是焦烤咖啡";
    }
}
/// <summary>
/// 家庭混合咖啡
/// </summary>
public class HouseBlend : Beverage
{
    public override double Cost()
    {
        return 2.3;
    }
    public override string GetDescription()
    {
        return "我是家庭混合咖啡";
    }
}
/// <summary>
/// 调料装饰者基类
/// </summary>
public abstract class CondimentDecorator : Beverage
{
    protected Beverage Beverage { get; set; }
}
/// <summary>
/// 摩卡
/// </summary>
public class Mocha : CondimentDecorator
{
    public Mocha(Beverage beverage)
    {
        this.Beverage = beverage;
    }
    public override double Cost()
    {
        return Beverage.Cost() + 0.7;
    }
    public override string GetDescription()
    {
        return Beverage.GetDescription() + ",加了摩卡";
    }
}
/// <summary>
/// 牛奶
/// </summary>
public class Milk : CondimentDecorator
{
    public Milk(Beverage beverage)
    {
        this.Beverage = beverage;
    }
    public override double Cost()
    {
        return Beverage.Cost() + 0.2;
    }
    public override string GetDescription()
    {
        return Beverage.GetDescription() + ",加了牛奶";
    }
}
/// <summary>
/// 调用
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
    Beverage beverage = new DarkRoast(); // 焦烤咖啡
    Console.WriteLine(beverage.GetDescription() + " $" + beverage.Cost());
    beverage = new Mocha(beverage); //添加摩卡
    Console.WriteLine(beverage.GetDescription() + " $" + beverage.Cost());
    beverage = new Milk(beverage);  //添加牛奶
    Console.WriteLine(beverage.GetDescription() + " $" + beverage.Cost());
    Beverage beverage2 = new Milk(new HouseBlend()); // 家庭混合咖啡加摩卡加牛奶
    Console.WriteLine(beverage2.GetDescription() + " $" + beverage2.Cost());
 
    Console.ReadLine();
}
优点:
缺点: 装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变的更复杂。并且更多的对象会是的差错变得困难,特别是这些对象看上去都很像。
在以下情况下应当使用装饰者模式:
.NET FrameWork 中的 System.IO.Stream 就用到了装饰者模式。
标签:esc 撤销 优点 crete eve 分享 委托 系统 mil
原文地址:http://www.cnblogs.com/snaildev/p/7640303.html