【问题标题】:Removing some of the options of decorated object in the decorating design pattern去除装饰设计模式中装饰对象的一些选项
【发布时间】:2014-03-03 14:04:17
【问题描述】:

我有一些如下所示的 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;
    }
}

如果您尽快回复我,我将不胜感激......

【问题讨论】:

    标签: c# design-patterns decorator


    【解决方案1】:

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

    为对象动态附加附加职责。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      相关资源
      最近更新 更多