2013-07-13 139 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