装饰模式(Decorator Pattern)

      装饰模式通过采用组合,而非继承的手法,实现了在运行时动态地扩展对象功能的能力。
      下例通过饮料店中饮料和调料的关系模拟了装饰模式的用法,其中结构图与类对应关系是:
      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
posted @ 2009-07-26 12:02  binfen  阅读(375)  评论(3编辑  收藏  举报