状态模式似乎是一个体面的适合。您可以将系统中的每个节点建模为状态。
首先,你的目标应该是:
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(开放关闭原则)添加更多节点。
谢谢,非常有用 – jonho
我昨天晚上实现了这一点,它让我感到我不能测试它,因为我每次新建一个节点。我如何使用依赖注入来解决这个问题? – jonho
也许通过使用NodeFactory。所以你可以说:“ctx.State = factory.CreateNode2(ctx)”,你的测试可以断言与工厂的交互。 Handle方法可以接受NodeFactory的参数。 – aquaraga