4

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

  1. 节点 1

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

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

    • 如果尺寸大,则转到节点 6
    • 否则转到节点 10

ETC

我一直在研究最初似乎解决了我的问题的责任链模式。但是,在我的大多数节点(处理程序)中,我需要有 2 个后续节点(真路径和假路径)才能潜在地调用。

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

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

谢谢你的时间。

4

1 回答 1

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);
    }
}

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

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

将整个对象传递给节点可能是一种气味。相反,您甚至可以传入一个接口。

我看到这种方法的唯一缺点是某种类爆炸。可能有与节点一样多的类。

然而,该设计将是相当可扩展的——从某种意义上说,如果需要,您可以根据 OCP(开闭原则)添加更多节点。

于 2013-07-13T15:55:58.687 回答