当实现仅在单个方法中有所不同时,建议使用哪种设计模式?

Edw*_*ard 4 java oop inheritance abstract-class design-patterns

我有一个界面,有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()
}
Run Code Online (Sandbox Code Playgroud)

我无法改变界面.

我的第一个想法是生成一个抽象类并实现前五个方法.对于具体实现(例如DataSetsXML,DataSetsYAML...),我只需要实现getSerializedVersion()和能够读取String并初始化对象的构造函数.

为了使它更易于测试,不同的设计可能会更好(/sf/answers/529870701/),但哪一个?

答案可能是主观的,但我认为有一些一般规则或不同方法的最小(客观)优点和缺点,......

Jac*_*ack 9

从你解释的是,差异是与类的行为无关的东西,而是它是如何序列化和反序列化的.我的意思是,DataSetsXMLDataSetsYAML将具有相同的相同的funcionality,但他们将被序列化到不同的格式.

这意味着getSerializedVersion()DataSets班级保持一致没有任何好处.你应该完全解耦他们.

您可以使用序列化接口:

interface DataSetsSerializer
{
  public DataSets unserialize(String string);
  public String serialize(DataSets sets);
}
Run Code Online (Sandbox Code Playgroud)

然后在这个类中处理不同的实现,例如:

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

  public String serialize(DataSets sets) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

通过详细阐述JB Nizet注释,如果你必须保持一个实例DataSetsSerializer内部DataSets(恕我直言,因为它们应该在任何情况下解耦,因为序列化的特定方式不应该绑定到要序列化的数据)然后方法如下:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

这需要对建议的界面稍作改动,这不是一个聪明的设计,但它尊重您的要求.