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/),但哪一个?
答案可能是主观的,但我认为有一些一般规则或不同方法的最小(客观)优点和缺点,......
从你解释的是,差异是与类的行为无关的东西,而是它是如何序列化和反序列化的.我的意思是,DataSetsXML
和DataSetsYAML
将具有相同的相同的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)
这需要对建议的界面稍作改动,这不是一个聪明的设计,但它尊重您的要求.
归档时间: |
|
查看次数: |
93 次 |
最近记录: |