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

jon*_*nho 4 c# design-patterns chain-of-responsibility c#-4.0

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

  1. 节点1

    • 如果颜色为红色goto节点2
    • 否则转到节点3
  2. 节点2

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

    • 如果大小大,那么转到节点6
    • 否则转到节点10

等等

我一直在关注责任链模式,它最初似乎解决了我的问题.但是,在我的大多数节点(处理程序)中,我需要有2个后续节点(真实路径和错误路径)才能进行调用.

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

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

谢谢你的时间.

aqu*_*aga 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(); } }
}
Run Code Online (Sandbox Code Playgroud)

检查颜色,重量等的业务逻辑将处于相应的状态.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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