2013-11-02 144 views
0

我已经实现了一个装饰模式,现在我想写一个方法“添加装饰”,这是最好的类/接口有这种方法ICAR或汽车?以及如何将基础车指向新的装饰车?装饰模式

样品使用:

ICar car=new Car(); 
ICar radial= new Radial(); 
car.AddDecoration(radial); 

interface ICar 
    { 
    int Speed { get; set; } 
    void Accelerate(); 
    } 

    class Car : ICar 
    { 
      private int speed = 0; 

      public int Speed 
      { 
       get 
       { 
        return speed; 
       } 
       set 
       { 
        speed = value; 
       } 
      } 

      public virtual void Accelerate() 
      { 
       Speed += 5; 
      } 
    } 

    abstract class CarModification : ICar 
    { 
     private ICar modifiedCar; 

     public ICar ModifiedCar 
     { 
      get { return modifiedCar; } 
      set { modifiedCar = value; } 
     } 

     public virtual int Speed 
     { 
      get 
      { 
       return modifiedCar.Speed; 
      } 
      set 
      { 
       modifiedCar.Speed = value; 
      } 
     } 

     public void Accelerate() 
     { 
      modifiedCar.Accelerate(); 
     } 
    } 

    class Radial : CarModification 
    { 
     public void Accelerate() 
     { 
      base.Accelerate(); 
      Speed += 1; 
     } 
    } 
+0

它在接口,随后将具体类被定义为好。 –

+0

那么我是否还需要在抽象装饰类中实现它呢?那么第二部分呢? – Desire

+0

这不是实现装饰器模式的典型方法。装饰者应该在构造函数中使用装饰对象,并且装饰者和装饰者都实现相同的接口/抽象类。 –

回答

3
interface ICar 
    { 
     int Speed { get; set; } 
     void Accelerate(); 
    } 

    class Car : ICar 
    { 
     public int Speed { get; set; } 
     public virtual void Accelerate() 
     { 
      Speed += 5; 
     } 
    } 

    class Radial : ICar 
    { 
     private readonly ICar modified; 

     Radial(ICar modified) 
     { 
      this.modified = modified; 
     } 

     public int Speed 
     { 
      get { return modified.Speed; 
      set { modified.Speed = value; } 
     } 

     public void Accelerate() 
     { 
      modified.Accelerate(); 
      modified.Speed += 1; 
     } 
    } 


    ICar car = new Radial(new Car()); 
    car.Accelerate(); 
+0

我想要它的反义词, ICar car = new Car(); ICar radial = new Radial(); car.AddDecoration(radial); – Desire

+3

那么也许你不想装饰者模式? –