最合适的设计模式来实现流程图/模型

时间:2013-07-13 15:20:34

标签: c# c#-4.0 design-patterns chain-of-responsibility

我必须在C#中实现流程图结构。我将数据传递给第一个节点,它将检查一些数据项(布尔值),然后将数据路由到两个后续节点之一,依此类推。
基本的逻辑流程是这样的:

  1. 节点1

    • 如果颜色为红色goto节点2
    • 其他转到节点3
  2. 节点2

    • 如果重量10则转到节点4
    • 其他转到规则5
  3. 节点3

    • 如果尺寸大,则转到节点6
    • 其他转到节点10
  4. 我一直在关注责任链模式,这种模式最初似乎解决了我的问题。但是,在我的大多数节点(处理程序)中,我需要有2个后续节点(真实路径和错误路径)来进行潜在调用。

    看看CoR模式的实现,似乎有一个NextHandler(Next Node)概念,但不是NextHandlerA和NextHandlerB - 例如。

    因此,如果不是CoR哪种模式更适合解决这个问题。规则和顺序可能会经常变化。

    感谢您的时间。

1 个答案:

答案 0 :(得分:6)

状态模式似乎很合适。您可以将系统中的每个节点建模为状态。

首先,您的对象将是:

public class Object
{
    public string Color { get; set; }
    public int Weight { get; set; }
    public int Size { get; set; }

    private NodeState _state;
    public NodeState State { get { return _state; } set { _state = value; _state.Handle(); } }
}

检查颜色,重量等的业务逻辑将处于相应的状态。 Node1看起来像:

public class Node1 : NodeState
{
    private readonly Object ctx;

    public Node1(Object ctx)
    {
        this.ctx = ctx;
    }

    public void Handle()
    {
        if (ctx.Color.Equals("Red"))
            ctx.State = new Node2(ctx);
        else
            ctx.State = new Node3(ctx);
    }
}

首先,您将创建Object并为其设置初始状态。

var obj = new Object(){Color = "Red", Weight = 10, Size = 5};
obj.State = new Node1(obj);

将整个物体传递给节点可能是一种气味。相反,你甚至可以传入一个界面。

我用这种方法看到的唯一不利方面是某种类爆炸。可能存在与节点一样多的类。

然而,设计将是非常可扩展的 - 从某种意义上说,如果需要,您可以添加更多节点,符合OCP(开放封闭原则)。