2014-03-06 71 views
0

解決的問題:給圖的所有節點賦予一個優先級(int值)。有一個帶有屬性Graph的DAG類(來自JGraphT庫的類型爲DirectedGraph)。此外,必須有不同的算法來分配優先級,並且必須能夠在未修改現有代碼的情況下添加新的算法。 首先創建DAG,然後用戶可以選擇使用哪種算法(在GUI中使用組合框)。用戶必須有可能隨時更改算法。圖節點優先級設計模式

方法1: 爲算法開發一個接口(算法),並使所有算法實現該接口。 在DAG類中,添加一個新的屬性:

Algorithm myAlgo; 

每次用戶在GUI上選擇不同的算法,實例化算法:

myAlgo = new AlgorithmNumberX; 

方法2: 獨立地寫優先任務(不作爲DAG的屬性),請使用靜態方法來優先化DAG的節點,方法是將DAG作爲參數發送並返回修改的DAG。

每種方法都有哪些優點?

+2

該算法不是圖的固有部分,所以我不建議將它作爲字段存儲。但我不確定爲什麼你提出了第二種方法的「靜態」方法。爲什麼不是'interface Algorithm {void workOn(Graph g); }'? (順便說一句:優先級是直接存儲在DAG(或其節點)中,還是通過外部數據結構(如「Map 」)?) – Marco13

+0

優先級直接存儲在DAG的節點中。當然,我需要創建一個接口,所以以後可以添加多個算法。但關鍵是我不確定算法是否應該是自己圖的屬性,還是獨立的問題。 – capovawi

回答

1

我會親自去選擇1(如我最近有)。你基本上是在描述一個戰略模式(實際上是兩種選擇的組合)。這種方法唯一可能出現的問題是讓類名輸入到組合框中。您還需要添加一個爲您創建實例的對象。如果您執行新的Algorithmx,則需要爲每個添加的算法添加另一個這樣的語句,這與您聲明的要求相反。

public class AlgorithmStrategy 
{ 
    public static final Algorithm getAlgorithm(String className) 
    { 
     Algorithm algorithm = null;   
     String name = "<package algorithms are in>." + className;   
     try 
     { 
      algorithm = (Algorithm)Class.forName(name).newInstance(); 
     } catch (InstantiationException | IllegalAccessException 
       | ClassNotFoundException e) { 
      e.printStackTrace(); 
     }   
     return algorithm; 
    } 
} 

在這個例子中算法是你的接口。創建每個具體類以實現您的界面並相應地確定您的優先級。

使用像:

Algorithm algorithm = AlgorithmStrategy.getAlgorithm("Algorithmx"); 

其中「Algorithmx」從您的組合中檢索

+0

這似乎是根據組合中選定的選項自動創建算法的好選擇。是的,戰略模式是我需要隔離代碼的變化部分,即算法。 – capovawi

+0

我認爲在包名稱和類名onesixtyfourth之間缺少一個點(。):String name =「<程序包算法在>」。 + className; – capovawi

+0

是的,我將編輯 – onesixtyfourth

1

你爲什麼把設計模式標籤在這個再沒有提到他們呢?

這顯然是Strategy Pattern的工作。

另一件值得思考的事情就是對圖形本身進行泛化,所以有一種方法可以實現Graph。這樣你就可以得到任何圖形並能夠隨意評分。

這裏的另一個問題是這個得分的目的是什麼?訂購,對嗎?所以你基本上正在製作一個索引,不是嗎?你可能想要其他順序?因此,一些組織可以將多個不同的訂單分組在一起,這樣做會很有意義,那麼您可能可以在沒有干預重建的情況下切換它們(如您所述)。

+0

對不起,不提模式的名稱,我仍然是這個領域的新手。目的是根據每個節點的優先級值獲得一個有序列表,是的。但我不需要同時訂購不同的訂單。當用戶通過GUI選擇prio標準時,優先級可能會隨時完成。 – capovawi