我有一个项目,其中有两个类都需要更新同一张表的数据库访问对象。框架和项目的约束使得它无法合并这两个类。我在下面创建了一个案例,展示了如何进行设置。A类需要能够更新和读取记录,而B类需要能够更新和删除记录。
如果我按原样使用这些类,则可以正常工作,但是我对每个类都需要不使用它的功能这一事实感到怀疑。例如,为了使用类A,我必须将实现删除功能的dao传递给它,即使它永远不会被调用。同样,我必须将实现read函数的dao传递给B类,但它永远不会被调用。
我考虑过通过继承其他接口(IReadDao,IUpdateDao,IDeleteDao是将要继承的dao)来实现该方法,但是这种方法对于每种功能组合(IUpdateAndRead,IReadAndDelete,IReadAndUpdate ... )
我想为dao使用接口,因为我不想将应用程序与数据库耦合。有没有一种模式或方法可以实现任何人都知道的我想要的东西?提前致谢。
class IDao {
void update(ModelDao model);
void delete(String guid);
ModelDao read(String guid);
}
Class A {
private IDao dao;
public A(IDao dao) {
this.dao = dao;
}
public void doStuff() {
ModelDao model = new ModelDao();
...
dao.update(model);
}
public void readThenDoSomething(String id) {
ModelDao model = dao.read(id);
...
}
}
Class B {
private IDao dao;
public B(IDao dao) {
this.dao = dao;
}
public void makeUpdate() {
ModelDao model = new ModelDao();
...
dao.update(model);
}
public void delete(String id) {
dao.delete(id);
}
}
2
为什么每个组合都需要单独的接口,而不是仅让使用它们的类实现所需的接口?
—
yitzih
在上述情况下,我不必将IDao传递给A的构造函数,而必须传递一个实现IUpdate和IRead的对象,那么实例变量“ dao”的类型将是什么?不必一定是IUpdateAndReadDao之类的东西吗?它仍然需要是一个接口,因为如果我告诉它采用特定于数据库的实现,那么我已经将该类耦合到了db。那是你在问什么吗?
—
jteezy14
我认为这是接口隔离原理(
—
克里斯托弗·弗朗西斯科
I
from SOLID
)的完美示例。可能想读一点。