2014-03-03 44 views
-1

我有一些C#代碼如下所示,並且我想在添加後刪除裝飾對象,例如我有一杯牛奶和糖加餅乾,我想要從Order類中刪除糖,如何做到這一點與裝飾設計模式:在裝飾設計模式中刪除一些裝飾對象的選項

public abstract class Order 
{ 
    private int _Cost = 0; 
    private string _Description = ""; 
    public virtual int GetCost() 
    { 
     return _Cost; 
    } 
    public virtual string GetDescription() 
    { 
     return _Description; 
    } 
} 

public class Coffee : Order 
{ 
    int _Cost = 3000; 
    string _Description = "Coffee"; 
    public override int GetCost() 
    { 
     return _Cost; 
    } 
    public override string GetDescription() 
    { 
     return _Description; 
    } 
} 

public class Tea : Order 
{ 
    int _Cost = 2000; 
    string _Description = "Tea"; 
    public override int GetCost() 
    { 
     return _Cost; 
    } 
    public override string GetDescription() 
    { 
     return _Description; 
    } 
} 

public abstract class Options : Order 
{ 
    int _Cost = 0; 
    string _Description = "No Option"; 
    public override int GetCost() 
    { 
     return _Cost; 
    } 
    public override string GetDescription() 
    { 
     return _Description; 
    } 
} 

public class Honey : Order 
{ 
    int _Cost = 800; 
    string _Description = "Honey"; 
    public Honey(Order order) 
    { 
     _Cost = _Cost + order.GetCost(); 
     _Description = order.GetDescription() + " And " + _Description; 
    } 
    public override int GetCost() 
    { 
     return _Cost; 
    } 
    public override string GetDescription() 
    { 
     return _Description; 
    } 
} 

public class Biscuit : Order 
{ 
    int _Cost = 400; 
    string _Description = "Biscuit"; 
    public Biscuit(Order order) 
    { 
     _Cost = _Cost + order.GetCost(); 
     _Description = order.GetDescription() + " And " + _Description; 
    } 
    public override int GetCost() 
    { 
     return _Cost; 
    } 
    public override string GetDescription() 
    { 
     return _Description; 
    } 
} 

public class Sugar : Order 
{ 
    int _Cost = 300; 
    string _Description = "Sugar"; 
    public Sugar(Order order) 
    { 
     _Cost = _Cost + order.GetCost(); 
     _Description = order.GetDescription() + " And " + _Description; 
    } 
    public override int GetCost() 
    { 
     return _Cost; 
    } 
    public override string GetDescription() 
    { 
     return _Description; 
    } 
} 

public class Milk : Order 
{ 
    int _Cost = 600; 
    string _Description = "Milk"; 
    public Milk(Order order) 
    { 
     _Cost = _Cost + order.GetCost(); 
     _Description = order.GetDescription() + " And " + _Description; 
    } 
    public override int GetCost() 
    { 
     return _Cost; 
    } 
    public override string GetDescription() 
    { 
     return _Description; 
    } 
} 

,如果你回答我儘快我很感激......

回答

1

你不能也不應該。裝飾者的目的是對他們的客戶(包括其他裝飾者)完全透明。也可以通過意圖裝飾應該用於(如通過GoF的指定):

附加額外的責任到對象動態。

順便說一句,我不認爲你BiscuitTea應該是爲了裝飾(並視爲訂單)。創建具有項目列表的Order。即使用聚合而不是繼承。考慮哪些服務員創建訂單:

  • 茶用糖和檸檬×2
  • 咖啡牛奶
  • 餅乾

我覺得你的域模型應該是一樣的。