Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除装饰设计模式中装饰对象的某些选项_C#_Design Patterns_Decorator - Fatal编程技术网

C# 删除装饰设计模式中装饰对象的某些选项

C# 删除装饰设计模式中装饰对象的某些选项,c#,design-patterns,decorator,C#,Design Patterns,Decorator,我有一些C#代码,如下所示,我想在添加后删除装饰对象,例如我有一杯加牛奶和糖的茶加饼干,我想从Order类中删除糖,如何使用装饰设计模式做到这一点: public abstract class Order { private int _Cost = 0; private string _Description = ""; public virtual int GetCost() { return _Cost; } public vi

我有一些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;
    }
}

如果您能尽快回答我,我将不胜感激……

您不能也不应该这样做。装饰者的目的是对他们的客户(包括其他装饰者)完全透明。此外,装饰师应按其意图用于(按照GoF的规定):

动态地将附加职责附加到对象

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

  • 加糖和柠檬的茶x 2
  • 牛奶咖啡
  • 饼干
我认为你的领域模型应该看起来是一样的