我有一个Java问题,我无法看到如何正确实现这些方法。我对建筑不太满意。
Data Manager界面类:
public interface DataManager {
public void readData();
public void writeData();
}
数据摘要类:
public abstract class Data implements DataManager {
@Override
public void readData() {};
@Override
public void writeData() {};
}
数据读取器类:
public class DataReader extends Data {
// I want to implement the readData() here
}
Data Writer类:
public class DataWriter extends Data {
// I want to implement the writeData() here
}
如果我想在只有一个接口的两个不同类中分别实现readData()和writeData(),是否可能?我不知道为什么我这样做。当我向读者或作家类添加更多方法时,它可能看起来更简洁。我应该只在一个班级中实现所有内容吗?
我希望这个库允许使用manager对象的用户访问数据读取和写入。但是为了实施,我不知道如何正确地做到这一点。
答案 0 :(得分:3)
看起来你偶然发现了“Interface Segregation Principal”的原因。 https://en.wikipedia.org/wiki/Interface_segregation_principle
虽然DataReader
和DataWriter
最初看似相关,看起来将它们组合到您的公共接口DataManager
中似乎是有意义的,但是阅读和写作的工作是相当的不同的,并保证分成两个接口,例如IReader
和IWriter
。
假设您有一个同时需要读者和作者的类,因此您的DataManager
界面是有意义的。但是,没有什么可以阻止您传递两个对象,一个类型为IReader
,另一个类型为IWriter
,即使它们是下面的同一个类。但似乎您已将它们分为DataReader
和DataWriter
,这很好。正如其他答案所暗示的那样,这是单一责任委托人的应用。
答案 1 :(得分:2)
编程的最佳实践是单一责任原则"。读者不是作家,所以它不应该是DataManager
的子类型,要求它的实现者都是。通过定义为整个接口创建空方法的抽象类,您也失去了拥有接口的价值。接口是每个实现者必须/是其超类型的情况的契约。读者不是/ be-a / reader 和作家的候选人。您需要一个单独的读写器界面,并让您的读者实现一个,另一个编写者,数据管理员可以实现这两者。
另外,请勿在名称中使用Reader
和Writer
分别列出java.io.Reader
和java.io.Writer
不属于的子类型。既然您正在考虑"数据管理员",也许您可以使用ReadManager
和WriteManager
,或类似的东西,让人们知道您没有使用标准的Reader
和Writer
层次结构。
答案 2 :(得分:0)
如果您只有某个子类实现每个方法,则不需要DataManager
或Data
。只需让DataReader
和DataWriter
只包含他们需要的方法,例如:
public class DataReader {
public void readData() {...}
}
...
public class DataWriter {
public void writeData() {...}
}
扩展和实现的全部原因是要么清理代码,要么允许覆盖其他方法。你这样做的方式既没有,所以为什么不保持简单呢?
答案 3 :(得分:0)
经过大量修改,所以我这样做,我认为这符合我的解决方案。
Data Manager界面类:
public interface DataManager {
public Data readData(); // from database
public void writeData(); // to database
}
DataConnector类:
public class DataConnector implements DataManager {
DataCreate creator = new DataCreate();
@Override
public Data readData() {
return creator.readData();
};
@Override
public void writeData() {
creator.writeData();
};
public Connection getConnection() {...};
public void close() {...};
}
数据创建类:
public class DataCreate {
public void readData() {
new DataReader().readData();
}
public void writeData() {
new DataWriter().writeData();
}
}
数据读取器类:
public class DataReader {
// I want to implement the readData() here
public Data readData(){...};
}
Data Writer类:
public class DataWriter {
// I want to implement the writeData() here
public void writeData(){...};
}
示例:
DataManager manager = new DataConnector();
manager.readData();
manager.writeData();
因此,客户端将仅使用管理器公共接口中的方法来进行数据库读取和写入。爱德华彼得斯向我提到了作文,当时我并不理解。我不太确定我现在正在做的是组合应该做什么。我认为应归功于他。谢谢你的帮助。