我建议为服务和DAO创建接口。很多时候,您会希望在使用此服务的代码的单元测试中模拟服务。 例如Spring强制您在使用某些Spring代理(例如事务)时使用接口。因此,您应该为服务创建一个接口。
DAO是更内部的部分,但我总是尝试为它们使用接口来简化测试。
我喜欢接口加具体实现的方式,原因如下:
实现的子类用于创建符合接口合同的业务/应用程序逻辑。
我只实现了服务层,没有关心接口(除非必要)。 我可能应该写接口,但是到目前为止还没有遇到问题。我在没有模拟服务层的情况下很好地进行单元测试。
此外,我没有DAO层,因为我正在使用Hibernate,它似乎有些过度。 我的许多理由都基于 Bozho精心撰写的博客。
我认为是否需要DAO和Hibernate是 非常有争议的,但是我对我的决定非常满意,我传递厚重的领域对象,然后只需调用Hibernate会话。 DAO层上的每个方法实际上只有一行代码(session.persist(mObject)或类似代码)。
我听到的一个反对意见是DAO层将使以后更容易更改/删除ORM。 我不确定在第一次编写DAO层所花费的时间加上更改所需的时间是否比单独编写更改的时间少。 我从未在工作中改变过ORM技术,因此风险较小。
接口+实现的方式用于实现松耦合。这样你可以很容易地更改或切换实现,而不需要进行大量代码修改。
想象一下这样一个场景:你正在使用Hibernate进行持久化(DAO层),但是你需要切换到JPA、iBatis或任何其他ORM。如果你使用接口,你只需编写特定于JPA的实现,然后将其“插入”到Hibernate的位置即可。服务代码保持不变。
接口+实现模型的另一个优点是Java本身支持接口代理,而创建实现代理需要使用诸如cglib之类的库。这些代理对于事务支持等方面是必要的。
看看我的关于“fastcode”的帖子,这是一个Eclipse-Spring插件,可以为您的DAO生成服务层。非常好用。 为GWT/Spring/Hibernate/PostgreSQL生成服务/DAO层