我有一个接口(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()
}
我无法更改界面。
我的第一个想法是生成一个抽象类并实现前五个方法。对于具体的实现(例如 DataSetsXML
,DataSetsYAML
,...)我只需要实现 getSerializedVersion()
和能够实现的构造函数读取字符串并初始化对象。
为了使其更易于测试,不同的设计可能会更好 (https://stackoverflow.com/a/7569581),但是哪一个呢?
答案可能是主观的,但我认为有一些通用规则或不同方法的至少(客观)优点和缺点,...
最佳答案
根据您的解释,不同之处在于与类的行为无关,而只是序列化和反序列化的方式。我的意思是 DataSetsXML
和 DataSetsYAML
将具有相同的相同功能,但它们将被序列化为不同的格式。
这意味着保持 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/