您的位置:首页 > 其它

装饰模式(Decorator Pattern)

2009-07-26 12:02 344 查看
装饰模式通过采用组合,而非继承的手法,实现了在运行时动态地扩展对象功能的能力。
下例通过饮料店中饮料和调料的关系模拟了装饰模式的用法,其中结构图与类对应关系是:
Beverage = Component
Espresso(HouseBlend) = ConcreteComponent
CondimentDecorator = Decorator
Sugar(Milk/Mocha) = ConcreteDecorator



public class CoffeeStore
{
public static void Main()
{
Beverage beverage = new Espresso();
//订了一杯Espresso
Console.WriteLine("Coffee name:{0} Cost:{1}", beverage.GetDescription(), beverage.Cost());

//订了一杯HouseBlend,加Sugar,加Milk
Beverage beverage2 = new HouseBlend();
beverage2 = new Sugar(beverage2);
beverage2 = new Milk(beverage2);
Console.WriteLine("Coffee name:{0} Cost:{1}", beverage2.GetDescription(), beverage2.Cost());

Console.ReadLine();
}
}

public abstract class Beverage
{
protected string description = "unknown";

public virtual string GetDescription()
{
return description;
}

public abstract double Cost();
}

#region 咖啡
public class Espresso : Beverage
{
public Espresso()
{
this.description = "Espresso";
}

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

public class HouseBlend : Beverage
{
public HouseBlend()
{
this.description = "HouseBlend";
}

public override double Cost()
{
return 6.8;
}
}
#endregion

#region 调味
public abstract class CondimentDecorator : Beverage
{
public abstract override string GetDescription();
}

public class Sugar : CondimentDecorator
{
Beverage beverage;
public Sugar(Beverage beverage)
{
this.beverage = beverage;
}

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

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

public class Milk : CondimentDecorator
{
Beverage beverage;
public Milk(Beverage beverage)
{
this.beverage = beverage;
}

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

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

public class Mocha : CondimentDecorator
{
Beverage beverage;
public Mocha(Beverage beverage)
{
this.beverage = beverage;
}

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

public override double Cost()
{
return beverage.Cost() + 3.5d;
}
}
#endregion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: