狀態模式似乎是一個體面的適合。您可以將系統中的每個節點建模爲狀態。
首先,你的目標應該是:
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