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