head first 设计模式 装饰

 此书借助的例子是 星巴兹加菲
当用户需要houseblend 再加调料蒸奶,豆浆,摩卡,等调料。
那此时不可能每个houseblend加一个调料变成一个对象吧。如果是这样
就麻烦了,当主料有10种,调料有10种,则有100个对象,况且
当多添加一种主料又要多加10个对象,那样肯定是不可能的。
那我们采取的做法是
建立10个主料对象,再建10个调料对象来装饰10个主料对象的超对象,
这样当你需要一杯主料加调料也至多创建11个对象。如果按照上面的话虽说也是创建11个对象,但每个对象里面有很多冗余代码,且一旦要修改了,就麻烦了。
用了装饰模式就简化了。
上面是感受,下面才是真正要看的东西是代码。
估计看了代码再去理解我的感受,应该会有体会。

 

using System;

using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Decorator
{
    class Program
    {
        static void Main(string[] args)
        {
            ///测试
            Beverage beverage = new Espresso();
            System.Console.WriteLine(beverage.GetDescription()+"$"+beverage.Cost());

            Beverage beverage3 = new HouseBlend();
            beverage3 = new Mocha(beverage3);

            beverage3 = new Mocha(beverage3);
            System.Console.WriteLine(beverage3.GetDescription() + "$" + beverage3.Cost());

        }
    }

   /// <summary>
   /// 装饰类
   /// </summary>
    public abstract class Beverage
    {
        public string strDescription = "unknow Beverage";

        public virtual string GetDescription()
        {
            return strDescription;
        }

        public abstract double Cost();

    }

    /// <summary>
    /// 扩展类
    /// </summary>
    public abstract class CondimentDecorator : Beverage
    {
        public override string GetDescription()
        {
            return strDescription;
        }
    }

    /// <summary>
    /// 主料类
    /// </summary>
    public class Espresso : Beverage
    {
        public Espresso()
        {
            strDescription = "Espresso";
        }

        public override double Cost()
        {
            return 1.99;
        }
    }

    /// <summary>
    /// 主料类
    /// </summary>
    public class HouseBlend : Beverage
    {
        public HouseBlend()
        {
            strDescription = "House Blend Coffee";
        }

        public override double Cost()
        {
            return 0.89;
        }
    }

    /// <summary>
    /// 装饰类
    /// </summary>
    public class Mocha : CondimentDecorator
    {
        Beverage beverage;
        public Mocha(Beverage beverage )
        {
            this.beverage = beverage;
        }

        public override  string GetDescription()
        {
            return beverage.GetDescription() + ",Monia";
        }

        public override double Cost()
        {
            return 0.20 + beverage.Cost();
        }
             

    }
}

posted @ 2010-01-26 16:23  潇潇息一去不复返  阅读(301)  评论(0编辑  收藏  举报
努力才能前进,勤耕博客才能看远