2013-11-02 8 views
0

У меня есть реализация шаблона декоратора, Теперь я хочу написать метод «Добавить украшение», который является лучшим классом/интерфейсом для этого метода ICar или Car? и как указать основной автомобиль на новый украшенный автомобиль?Decorator Pattern

Пример использования:

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 = новый Radial(); автомобиль.AddDecoration (радиальный); – Desire

+3

Тогда, может быть, вам не нужен узор декоратора? –

Смежные вопросы