2013-07-13 44 views
3

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

  1. 节点1

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

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

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

etc

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

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

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

谢谢你的时间。

回答

4

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

首先,你的目标应该是:

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

+0

谢谢,非常有用 – jonho

+0

我昨天晚上实现了这一点,它让我感到我不能测试它,因为我每次新建一个节点。我如何使用依赖注入来解决这个问题? – jonho

+1

也许通过使用NodeFactory。所以你可以说:“ctx.State = factory.CreateNode2(ctx)”,你的测试可以断言与工厂的交互。 Handle方法可以接受NodeFactory的参数。 – aquaraga