c# - 哪种设计模式允许获得此架构

标签 c# oop design-patterns inheritance architecture

我有以下对象:

  • 公式
  • 股票
  • 柜台
  • 等...

所有这些对象都称为指标并具有共同的属性(Id、名称、值...)。 每个实体都有自己的属性:

  • 公式:FormulaExpression、FormulaCode、OperandsList ...
  • 股票:StockValue、StockLimit...
  • 计数器:CounterIndex...
  • 等...

所以从逻辑上讲,我必须创建包含通用属性的指标类,并且对于每个实体我必须创建一个继承自指标的类。

公式是一种特殊的指标,可以包含任何类型的指标。公式的指示符被命名为操作数。

操作数对象具有以下属性: operandId, operandCode, operandIndex

当我想列出公式操作数时,我想获取从指标、操作数和实体类型继承的对象(例如,创建一个具有指标属性、操作数属性和股票属性的对象)

哪种设计模式或哪种架构允许我有这种行为?


进一步解释问题

实体(FormulastockCounter..)是Indicators,不是必需的操作数操作数也是指标。对象 Indicator 是实体的原始类型,我们可以创建一个 Indicator 然后将其装饰成一个 Formula ,而不是装饰成当它被添加到另一个 Formula 时成为一个 Operand

最佳答案

最好的方法是使用一个 expando 对象,每个操作数使用多态分派(dispatch) 填充该对象。 expando 对象允许您添加自定义属性,多态分派(dispatch)允许您关闭代码以防止操作数更改。

您将从使用包含基本元素的 Operand 的基类开始

public abstract class Operand
{
    public int Id { get; set; }
    public string Name { get; set; }

    public dynamic BuildObject()
    {
        dynamic o = new ExpandoObject();
        o.Id = Id;
        o.Name = Name;
        AddPropertiesToObject(o);
        return o;
    }

    protected internal abstract void AddPropertiesToObject(dynamic o);
}

然后添加一个新的 Operand 类型就非常容易了,因为你可以独立地控制要添加的内容:

public class Stock : Operand
{
    public double StockValue { get; set; }

    protected internal override void AddPropertiesToObject(dynamic o)
    {
        // I decided to ignore the base class Id and Name
        // adding them would be trivial, but may not be what you need since 
        // it would overwrite the base values...
        // To add them you would have to wrap this virtual method call with
        // a call to a function doing the insertion in the base class 
        o.StockValue = StockValue;
    }
}

Formula 对象将简单地迭代包含的操作数并依次调用它们的 AddPropertiesToObject(当然它也可以添加自己的数据,但对于我没有的示例不包括任何)

public class Formula : Operand
{
    public List<Operand> InnerOperands { get; set; }

    protected internal override void AddPropertiesToObject(dynamic o)
    {
        foreach (var op in InnerOperands)
        {
            op.AddPropertiesToObject(o);
        }
    }
}

关于c# - 哪种设计模式允许获得此架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264292/

相关文章:

c++ - 如何避免在父构造函数更改时更改每个子构造函数

design-patterns - 我应该在 IoC 上走多远?

c# - .NET 隐藏标题栏但保留边框

java - 在这种情况下原型(prototype)模式的好处是什么

c# - Caliburn.Micro - 如何从 Conductor 以外的类激活 Item

javascript - 将简单的实用对象合并到更复杂的专用对象中的最佳方法是什么?

javascript - 在 JavaScript 类中使用回调

java - 为什么不把hasNext()、next()等方法放在Collection接口(interface)中呢?

c# - DateTimeFormatInfo.InvariantInfo 不一致的日期模式?

c# - 如何从 MVC 将数据发布到 Action URL