2016-03-30 10 views
4

我有一個用於管理數據集的6種方法的接口。實現中唯一不同的方法是getSerializedVersion()和能夠解析序列化字符串的構造函數。當實現僅在單一方法中有所不同時,推薦哪種設計模式?

public interface DataSets { 
    public void addEntry(...); 
    public void removeEntry(...); 
    public void manipulateEntry(...); 
    public SomeType getEntry(...); 
    public List<SomeType> getAllEntries(); 
    // This differs: 
    public String getSerializedVersion() 
} 

我無法更改接口。

我的第一個想法是生成一個抽象類並實現前五個方法。對於具體的實現(例如DataSetsXML,DataSetsYAML,...),我只需要實現getSerializedVersion()以及能夠讀取字符串並初始化對象的構造函數。

爲了使它更具可測性,不同的設計可能會更好(https://stackoverflow.com/a/7569581),但哪一個?

答案可能是主觀的,但我認爲有不同的方法的一些一般規則或至少(目標)的優點和缺點,...

+4

您可以使用單個類,並委託給序列化程序,作爲參數傳遞給構造函數,以實現getSerializedVersion()。有N個串行器實現(YamlSerializer,XmlSerializer等) –

+0

@JBNizet的答案是要走的路。從職責責任的角度來看,序列化似乎與管理數據集不同。不需要使用抽象類並進一步編碼這個設計錯誤,imo。 – Cardano

+0

@JBNizet:你能否從你的評論中寫出答案。 – Edward

回答

9

從你解釋的區別是什麼是不相關的類的行爲,但它是如何序列化和非序列化。我的意思是,DataSetsXMLDataSetsYAML將具有相同的功能,但它們會被序列化爲不同的格式。

這意味着保持getSerializedVersion()加上DataSets類沒有任何好處。你應該完全解耦它們。

你可以有一個串行接口排序:

interface DataSetsSerializer 
{ 
    public DataSets unserialize(String string); 
    public String serialize(DataSets sets); 
} 

,然後照顧differente實現的只是在這個類,如:

class YAMLDataSetsSerializer implements DataSetsSerializer 
{ 
    public DataSets unserialize(String string) { 
    DataSets sets = new DataSets(); 
    ... 
    } 

    public String serialize(DataSets sets) { 
    ... 
    } 
} 

通過擬訂關於JB Nizet評論,如果您必須保持一個DataSetsSerializer在一個DataSets實例(恕我直言,因爲它們應該在任何情況下都是分離的,因爲序列化的特定方式不應該被綁定到要被序列化的數據),因此恕我直言, ing:

class DataSets { 
    final private DataSetsSerializer serializer; 

    public DataSets(DataSetsSerializer serializer, String data) { 
    this.serializer = serializer; 
    serializer.unserialize(this, data); 
    } 

    @Override 
    public String getSerializedVersion() { 
    return serializer.serialize(this); 
    } 
} 

這需要在提議的接口稍作改動,它不是一個聰明的設計,但它尊重您的要求。

+0

因爲他不能改變接口,所以我還要補充說,當調用getSerializedVersion時,他應該拋出一個'UnsupportedOperationException'和一條關於使用這些序列化器的消息。 –

+0

我同意將序列化解耦。但是,API用戶需要持有兩個引用 - 一個用於DataSets,一個用於序列化。 (如果我錯了,請糾正我)。我想這就是爲什麼界面被定義爲它。所以可能來自'JB Nizet'的評論(代理到通過構造函數添加的序列化程序)的解決方案是我的方式。或者你認爲這種方法有什麼缺點? – Edward

+0

如果您在回答中討論「JB Nizet」的評論,以便我能接受它,那將會很棒。 – Edward

1

我認爲這是合理的使用抽象類。您可以測試抽象類的具體實現(它也間接測試抽象類)。

相關問題