装饰模式(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
下例通过饮料店中饮料和调料的关系模拟了装饰模式的用法,其中结构图与类对应关系是:
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
相关文章推荐
- Java之装饰模式(Decorator Pattern)
- 23种设计模式-7.装饰模式(Decorator Pattern)
- 设计模式之装饰模式(Decorator Pattern)
- 面向对象设计模式之---装饰模式(Decorator Pattern)
- 设计模式(二)之装饰模式(Decorator Pattern)
- 基于东北F4的设计模式情景剧——第一幕 装饰模式(Decorator Pattern)
- 装饰模式(Decorator Pattern)
- 设计模式心得:装饰模式 (decorator pattern)
- 设计模式8:Decorator Pattern (装饰模式)
- Java之装饰模式(Decorator Pattern)
- 我要六一儿童节礼物!!DecoratorPattern----装饰模式
- 装饰模式【Decorator Pattern】
- 7.5.1.2 装饰设计模式(THE DECORATOR DESIGN PATTERN)
- 设计模式[6] Decorator Pattern 装饰模式
- .NET设计模式(10):装饰模式(Decorator Pattern)(转)
- 设计模式(三)The Decorator Pattern 装饰器模式
- JAVA设计模式之 装饰模式【Decorator Pattern】
- Java之装饰模式(Decorator Pattern)
- 装饰模式(Decorator Pattern)
- 装饰模式(Decorator Pattern)