2010-04-20 77 views
0

惠!組織多級聚合對象或複合

我有聚合對象有多個級別。聚合根是網絡對象,它具有節點和鏈接的集合。節點和鏈接有段的集合,段有車道的集合。我的領域是交通網絡而這僅是該集合的一部分:

public class Network 
{ 
private List<Node> nodes; 
    private List<Link> links; 
}  
public class Node 
{ 
private Segment segment; 

}  
public class Link 
{ 
private List<Segment> segments; 
}  
public class Segment 
{ 
private List<Lane> lanes; 
} 
public class Lane 
{ 
private List<Cell> cells; 
}  
public class Cell 
{ 
private bool IsOccupied; 
} 

首先,可有人告訴我,這是好還是它更好地擊穿該聚合上也許三個層次(網絡,段細胞)在該根的頂部實施存儲庫模式。

我的問題是我想添加到網絡中的附加功能。如果這個網絡將被用於仿真,那麼模擬器需要車輛源和接收器,它們將產生並摧毀網絡邊緣的車輛。我的想法是讓這種功能脫離網絡聚合。這是代碼:

public class Simulation 
{ 
public void Iteration() 
{ 
    //do something with vehicles 
    //foreach sink in sinkRepository call o.Update() 

     } 

} 

public class SinkRepository 
{ 
private List<Sink> sinks; 

//Singleton pattern 

//+ CRUD operations and GetEnumerator() 
} 

public class Sink 
{ 
private int nodeId; 
private List<int> laneIds; 

public void Update() 
{ 
    //need reference to Network object 
    //foreach laneId 
    ////network.GetLane(id) 
    ////find is cell in lane occupied 
     ////if it is then network.SetCellStatus(false); 
     } 
} 

這樣做的好方法嗎?並且你有什麼建議:) 另外我有一些從XML創建網絡的持久性代碼,它也可以從XML創建接收器,但問題是如何應對網絡對象的傳遞引用以接收對象,因爲接收器對象需要引用網絡,因爲它需要根據laneId獲取通道。

我在考慮添加網絡存儲庫和存儲庫將是單身,所以下沉會看到它保持參考網絡拋出整個一生。

回答

0

你可以做的一件事就是找到正確的車道對象,每當你創建一個水槽並把它們放到水槽對象中。這將取代List<int> laneIdsList<Lanes>。您不需要在Sink中對Network進行參考,並在每次更新時搜索通道列表。

您仍然需要在SinkRepository或更好的SinkFactory類中使用網絡對象的引用,您可以在其中創建新的Sink對象並將它們設置爲正確的通道。

+0

好吧,但是不會違背集合模式來保存對Sink中Lane對象的引用嗎? – Vedran 2010-04-21 15:34:44

+0

好吧,它可能是。但真正的問題是這個解決方案對你有沒有效。模式是模式不是法律:) – derdo 2010-04-21 16:11:26