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