java - 当实现仅在一个方法上不同时,建议使用哪种设计模式?

标签 java oop inheritance design-patterns abstract-class

我有一个接口(interface),其中包含 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() 和能够实现的构造函数读取字符串并初始化对象。

为了使其更易于测试,不同的设计可能会更好 (https://stackoverflow.com/a/7569581),但是哪一个呢?

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

最佳答案

根据您的解释,不同之处在于与类的行为无关,而只是序列化和反序列化的方式。我的意思是 DataSetsXMLDataSetsYAML 将具有相同的相同功能,但它们将被序列化为不同的格式。

这意味着保持 getSerializedVersion()DataSets 类结合没有任何好处。你应该完全解耦它们。

你可以有一个序列化接口(interface):

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(恕我直言,这没有任何意义,因为它们在任何情况下都应该解耦,作为一种特定的序列化方式不应绑定(bind)到要序列化的数据)那么该方法如下:

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

这需要对建议的界面进行细微更改,这不是一个聪明的设计,但它尊重您的要求。

关于java - 当实现仅在一个方法上不同时,建议使用哪种设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36312783/

相关文章:

java - 如何中途停止异步任务

c++ - 为什么不保存变量中的更改?

c# - 在运行时动态创建和设置类的成员/属性

c++ - 模板继承和基本成员变量

安卓性能 : useless global variables vs inheritance

java - 无法在 JFrame 中使用 drawString() 打印任何字符串

java - 内容类型不支持 java Spring

java - 使用静态工厂方法获取更新了一个字段的新实例是否正确?

python - 将类及其函数传递给另一个类

java - 使用泛型为 MongoDB POJO 创建包装器