C#计算引擎的良好设计模式

时间:2016-06-06 16:53:24

标签: c#-4.0 design-patterns

我正在创建一个计算引擎,计算有4个级别

  1. LevelA1,A2
  2. 水平b
  3. LevelC
  4. LevelD
  5. 要计算LevelA2,我们需要首先计算LevelD并计算LevelD,我们需要LevelC第一个输出,LevelB我们需要LevelA1。

    现在在计算过程中,我们将计算在计算结束时需要输出的每个级别的几个中间值。

    大约有50个输入字段(这些字段的集合)和计算输出字段的计数几乎相似。

    我想知道一种最适合这种情况的设计模式。 几个具体问题:

    • 在计算过程中,我应该在计算过程中不断更新输入列表并输出,因为最终输出是输入和输出的组合。
    • 或者我是否应该为每个级别的输出设置单独的类,并在我们进行时将该输出传递到下一级别?

    提前致谢!!!

2 个答案:

答案 0 :(得分:0)

我认为这种情况最合适的模式是Command模式。 你可以找到很多这种模式的例子。我向你提供了其中一个。

Command pattern

答案 1 :(得分:0)

如果所有组件的结构相同,那么

Composite Pattern

如果您需要每个级别的历史记录或记录

Command Pattern

如果你想在不同的班级中承担所有责任,那么

Chain of Responsibility

如果你想要一个包装中的总复杂性,那么

Facade

在这种情况下,如果计算依赖性正在改变,我建议为组件创建一个类并保留组件的成员变量集合,即使用复合模式。每个子组件计算都将贡献给总组件结果。

这是大致的结构

    class sample
{
    int data;
    list<sample> childList;
    int resultUptoThisPosition;
    bool ifResultCalculatedUptoThisPosition;
    void calculateresult()
    {
        int childResult = 0;
        forall(var clild in childList)
        {
            if(child.ifResultCalculatedUptoThisPosition == false)
            {
                child.calculateresult();
            }
            childResult+=resultUptoThisPosition;
        }
        resultUptoThisPosition += childResult; // own result is calculated from child result
        ifResultCalculatedUptoThisPosition = true; // calculation is done
    }
}