2012-12-18 178 views
1

我有一個簡單的(可能很常見的)設計問題。比方說,我有一個看起來像這樣的接口:Java - 界面設計

public interface AnalysisResult { 

    BigDecimal getMeasure(); 

} 

然而,這由幾個不同的具體實現在後面實現 - 一些包括平均場以及各種性質的一些含計數等。現在,我給定一組AnalysisResult,我希望能夠根據類型輸出結果,即平均結果將說明什麼是平均值的措施之上等。一種方法來做到這一點將暴露在方法上的界面說outputResult(),但問題是我可能想輸出的HTML格式,CSV和許多其他結果,所以我會需要每個方法。此外,可能會出現這種情況,我希望根據類型輸出某些內容,例如:'這是平均結果'...您會說在這種情況下,簡單地使用instanceof並執行輸出端?

回答

1

我會去進一步擴展..像

public interface Measure { 
    public String getOutputAsTxt(); 
    public String getOutputAsCsv(); 
    public String getOutputAsFunnyFormat(); 
}; 

public interface AnalysisResult { 

    public Measure getMeasure(); 

} 

輸出專業化因此移動到特定措施。是的,這添加了一些代碼,但保持一切整齊和分離。

或者我會嘗試探索一下Visitor模式(這是一種簡單的實現)。

欲瞭解更多信息,請參閱選擇答案this SO question(我每次讀它的時候我覺得敦促+1其awesomess)

+1

訪客模式也是我想到的。我不想測量混合輸出邏輯 – Bober02

+0

@ Bober02有趣的鏈接問題最好的答案不是選擇的問題,而是最有價值的答案,它是C++,但可以很容易地在Java中進行轉換。我會這樣做,你不想專門化返回的對象。像往常一樣,它取決於你將擁有多少格式以及多久添加/更改它們。 – BigMike

+0

我還記得另一個問題:我想讓Outputter類獲取分析結果列表,並可能根據類型輸出一些元信息,例如列名稱。那麼,主要的要求是,集合只能包含一種特定類型的對象,如果你只是一個訪問者模式,我認爲這是不可能實現的,因爲它只接受基於父接口的對象 – Bober02

0

結果根據類型:

這是一個單獨的行爲,所以會建議你實施類似策略模式。有一個基於接口的方法print()。 (:即對擴展開放但收盤更改開閉原則)原則,那麼你可以在多個實現類,如CSVStylePrint,HTMLStylePrint等

這樣,你的打印功能都是獨立的,你按照OCP實現此方法。 OCP是戰略模式中使用的基本設計原則。

0

我建議在接口中使用public String getOutput(String format)方法。

讓實現根據'format'參數決定返回什麼。

這也有助於調用特定實現的方法。

+0

給出詳細的答案 – Chella

0

以通用xml格式保存結果數據,並使用XSLT將原始數據轉換爲您所需的格式。 JUnit用測試結果來做這件事。稍後您決定添加其他格式時,不需要更改代碼。