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

本文关键字:设计模式 实现 模型 流程图 | 更新日期: 2023-09-27 18:22:16

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

  1. 节点1

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

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

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

etc

我一直在研究责任链模式,它最初似乎解决了我的问题。然而,在我的大多数节点(Handlers)中,我需要有2个后续节点(真路径和假路径)来进行潜在调用。

看看CoR模式的实现,似乎有NextHandler(下一个节点)的概念,但没有NextHandlerA和NextHandlerB——例如。

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

谢谢你抽出时间。

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

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

首先,你的目标是:

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(开放-关闭原则)添加更多节点。