为什么在Dao设计模式或其他设计模式中使用接口

use*_*375 25 java spring design-patterns hibernate

请参阅以下Dao设计模式的组件:

数据访问对象模式或DAO模式用于将低级数据访问API或操作与高级业务服务分开.以下是数据访问对象模式的参与者.

数据访问对象接口 - 此接口定义要对模型对象执行的标准操作.

Data Access Object具体类 - 该类实现上面的接口.该类负责从数据源获取数据,该数据源可以是database/xml或任何其他存储机制.

模型对象或值对象 - 此对象是包含get/set方法的简单POJO,用于存储使用DAO类检索的数据.

当我们有一个具体的课程时,为什么我们需要一个INTERFACE?为什么我们不能直接使用它?这可能是一个天真的问题,但请帮助我明确这一点.不仅在DAO设计模式中,在其他设计模式中,使用INTERFACE也有点令人困惑.我同意这与代码可重用性和减少耦合有关.但任何人都可以请进一步解释.

Mat*_*lár 23

不仅在DAO设计模式中,在其他设计模式中,使用INTERFACE也有点令人困惑.

接口是Java中最常用的概念之一.让我用一个例子解释一下:假设你为汽车设计了一个GPS设备,它可以看到地图并自动将汽车转向地图中所示的方向.这种GPS设备可用于许多汽车,如奔驰,菲亚特等.对于每辆汽车,左右转动的机制可能根据汽车系统的实施而有所不同.因此,这些功能应该由汽车制造商编写,因此这些方法被放置在一个界面中,该界面由汽车制造商根据其汽车的实施来实现.该界面仅包括一组由汽车制造商定义的功能声明(在本例中).得到它了?

要了解有关接口及其有用的原因的更多信息,请阅读本文.

我的问题是:当我们有一个具体的类时,为什么我们需要一个INTERFACE,为什么我们不能直接使用它.

在下面的答案中指出的许多其他好处中,您可以为实现DAO接口的不同数据结构(derby db,大堆栈等)创建许多DAO类.好处是,每个类都可以存储在DAO接口变量中,它称为多态.

  • 很好的例子,一切都是真的.话虽如此,我的大多数客户都在1个数据库上:oracle和99.9%的客户只使用一个实现.在这些情况下,接口只能提供维护开销.这里的大多数男人可能不同意,但在这种情况下我不会使用它们.因为只有在需要增加时才应该实现/使用东西,你仍然可以很容易地从IntelliJ中的1个具体类中提取出一个接口.它只需要30秒的全自动重构. (5认同)
  • 同意.如果您只打算支持单个数据库,那么界面就会过度.如果你以后决定要支持很多?然后很容易切换到接口/工厂设计模式.特别是因为你的DAO的方法应该已经抽象出数据库(否​​则什么是用DAO打扰的重点). (3认同)

Jen*_*ger 13

实际上,当您只有一个实现时,没有必要拥有一个接口.但是在某种情况下,你对这个具体的课程没有依赖是非常实际的:

  • 测试调用DAO的服务:您可以编写一个模拟DAO,其行为与您在测试中所需的一样(例如,模拟没有数据库连接,很难自动重现)

  • 生成一些图层和你的DAO.您可以使用AOP围绕DAO方法生成缓存或事务处理.在这种情况下,您有一个实现DAO接口的对象,但与原始实现无关.

  • 切换数据库技术.如果从MySQL切换到DB2,您只需要编写接口的另一个实现并切换MySQL DAO和DB2 DAO

因此,为您提供DAO和服务接口是一个很好的做法.


Kis*_*ore 8

我的问题是,当我们有一个具体的课程时,为什么我们需要一个INTERFACE,为什么我们不能直接使用它.

这是简单的抽象.假设您使用Oracle数据库作为数据库.因此具体类将具有访问(CRUD操作)Oracle DB的逻辑.明天,如果您的许可证到期并且您不再想使用Oracle DB,那么您将需要使用MySQL.现在你必须重写已经提到的具体类,并且你必须重写服务层,因为通过直接使用具体类和它的方法,你在服务层和数据访问层之间有紧密耦合.人们应该始终考虑松散耦合的系统.

如果您使用接口而不是具体类,则服务层和数据访问层具有如何交互的契约.因此,服务层不会受到数据层更改的影响,因为合同没有改变,并且它们可以以相同的旧方式进行交互.