Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现流程图/模型的最合适的设计模式_C#_C# 4.0_Design Patterns_Chain Of Responsibility - Fatal编程技术网

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

C# 实现流程图/模型的最合适的设计模式,c#,c#-4.0,design-patterns,chain-of-responsibility,C#,C# 4.0,Design Patterns,Chain Of Responsibility,我必须用C#实现一个流程图结构。我将数据传递到第一个节点,它将检查一些数据项(布尔值),然后将数据路由到两个后续节点之一,依此类推。 基本逻辑流程如下所示: 节点1 如果颜色为红色,则转到节点2 否则转到节点3 节点2 如果重量为10,则转到节点4 否则转到规则5 节点3 如果大小较大,则转到节点6 否则转到节点10 等 我一直在研究责任链模式,它最初似乎解决了我的问题。然而,在我的大多数节点(处理程序)中,我需要有两个后续节点(真路径和假路径)来潜在地调用 看看CoR模式的实现,似

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

  • 节点1

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

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

    • 如果大小较大,则转到节点6
    • 否则转到节点10
  • 我一直在研究责任链模式,它最初似乎解决了我的问题。然而,在我的大多数节点(处理程序)中,我需要有两个后续节点(真路径和假路径)来潜在地调用

    看看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(); } }
    }
    
    检查颜色、重量等的业务逻辑将处于相应的状态。节点1看起来像:

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

    我昨晚来实现这一点,但我突然想到,当我每次都新建一个节点时,我将无法对其进行测试。我可以如何使用依赖项注入来实现这一点?也许可以使用NodeFactory。因此您可以说:“ctx.State=factory.CreateNode2(ctx)”,您的测试可以在与工厂的交互中断言。Handle方法可以接受NodeFactory的参数。