簡體   English   中英

當實現僅在單個方法中有所不同時,建議使用哪種設計模式?

[英]Which design pattern is recommended when implementations only differ in a single method?

我有一個界面,有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()
}

我無法改變界面。

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

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

答案可能是主觀的,但我認為有一些一般規則或不同方法的最小(客觀)優點和缺點,......

從你解釋的是,差異是與類的行為無關的東西,而是它是如何序列化和反序列化的。 我的意思是DataSetsXMLDataSetsYAML將具有相同的相同功能,但它們將被序列化為不同的格式。

這意味着保持getSerializedVersion()DataSets類相結合沒有任何好處。 你應該完全解耦他們。

您可以使用序列化接口:

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

然后在這個類中處理不同的實現,例如:

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

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

通過詳細闡述JB Nizet注釋,如果你必須在DataSets實例中保留一個DataSetsSerializer (由於它們應該在任何情況下解耦,因此IMHO沒有意義,因為序列化的特定方式不應該綁定到要序列化的數據)然后方法如下:

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);
  }
}

這需要對建議的界面稍作改動,這不是一個聰明的設計,但它尊重您的要求。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM