在装饰设计模式中删除装饰对象的一些选项

时间:2014-03-03 14:04:18

标签: c# design-patterns decorator

我有一些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 个答案:

答案 0 :(得分:1)

你不能也不应该。装饰者的目的是对他们的客户(包括其他装饰者)完全透明。其意图的装饰者也应该用于(由GoF指定):

  

动态附加对象的其他职责。

顺便说一下,我认为你的BiscuitTea不应该是订单的装饰者(并被视为订单)。创建包含项目列表的Order。即使用聚合而不是继承。考虑服务员创造的订单:

  • 含糖和柠檬的茶x 2
  • 咖啡加牛奶
  • 饼干

我认为您的域名模型应该看起来一样。