2010-10-14 109 views
2

我對Java相當陌生,我需要一些幫助來找出一個好的類層次結構和總體設計(我正在研究CS)。Java類設計 - 圖

該任務與圖論有關,因此我們被要求爲2種類型的圖形,簡單圖形和多圖形(允許有平行邊緣)以及相應的實現創建接口。

我想出了以下接口層次:

 
* Element 
    - Vertex 
    - Edge 
     + MultiEdge 
* Graph 
    - MultiGraph 

及其相應的實施方案。 現在我真的不想在這裏討論我的實際實現,我只是給我一些例子,因爲(至少我是這麼認爲的),我設計整體思維的方式遇到了麻煩。

整個事情工作得很好,直到我需要擴展我的圖形具有MultiGraph功能。下面是一個GraphImpl代碼片段:

 
protected final List edges; 

public Graph addEdge(Edge e) { 
    List newEdges = new ArrayList<Edge>(); 
    newEdges.addAll(edges); 
    newEdges.add(e); 
    return new GraphImpl(vertices, newEdges); 
} 

正如你所看到的,我圖形邊緣<邊緣>存儲在一個列表,我GraphImpl,爲此和我有很多的名單都在我的實現。另外,你可以看到我從addEdge返回了一個新的GraphImpl,因爲GraphImpl應該是不可變的。

有了這個實現多圖時,我遇到了很多麻煩,因爲在這裏,我需要交換名單<邊緣>的列表<MultiEdge>。但是當我重新定義了MultiGraph中的「邊緣」變量時,我認爲GraphImpl中的方法仍然訪問我在GraphImpl中定義的列表,因此如果我調用MultiGraph,則不會添加邊緣,直到爲MultiGraph完全重寫爲止。但後來我發現我不得不重寫它,因爲GraphImpl中的addEdge(自然地)返回一個GraphImpl,但在MultiGraphImpl中,我需要創建一個MultiGraphImpl。

我想明白的是,你將如何設計和實現這樣的事情。我擁有的是一堆相互延伸的接口,以及相同的實現層次,也相互延伸。

Graph的功能只是MultiGraph的一個子集,因此GraphImpl中所做的一切大多數對MultiGraphImpl也是有效的。現在,我需要將大量代碼從GraphImpl複製到MultiGraphImpl,只是爲了克服類型問題(我至少在某種程度上可以理解,但我不知道如何繞過它們)。

我希望你現在不要太困惑,因爲我確實是這樣;)如果我在任何部分都不清楚,我會很樂意澄清,只是指出我缺少什麼。

回答

1

可能是你需要一個Composite Pattern在這裏。它可以讓你以類似的方式處理單個和多個對象。也許這可以幫助你的設計。

0

這是一本非常完整的數據結構,由Goodrich/Tamassia爲Java書中的數據結構和算法設計。

給它一個試試吧:http://net3.datastructures.net/

而且,是的,我不支持多圖形,我需要