2014-03-03 40 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
  • 咖啡牛奶
  • 饼干

我觉得你的域模型应该是一样的。