我必须在C#中实现流程图结构。我将数据传递给第一个节点,它将检查一些数据项(布尔值),然后将数据路由到两个后续节点之一,依此类推。
基本的逻辑流程是这样的:
节点1
节点2
节点3
等
我一直在关注责任链模式,这种模式最初似乎解决了我的问题。但是,在我的大多数节点(处理程序)中,我需要有2个后续节点(真实路径和错误路径)来进行潜在调用。
看看CoR模式的实现,似乎有一个NextHandler(Next Node)概念,但不是NextHandlerA和NextHandlerB - 例如。
因此,如果不是CoR哪种模式更适合解决这个问题。规则和顺序可能会经常变化。
感谢您的时间。
答案 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(开放封闭原则)。