2007-09-06

关于dao service层设计的心得

关键字: dao service

图片太小了 看不清  请看附件

我们先看下面的类图


这是一个常用的dao层设计:

DAO (interface)

UserDAO extends DAO (interface)

BaseDAOHibernate implements DAO

UserDaoHibernate extends BaseDAOHibernate implements UserDao

采用这样的设计是为了提高代码的复用,在本例中就是基本的CRUD方法的复用

我们分析一下代码是怎么样被复用的

我们看一下中间的两个class UserDao BaseDaoHibernate 他们跟DAO接口都有直接的关系 一个是继承 一个是实现,换句话说他们都对DAO进行了扩展,UserDao是横向(接口)的扩展,BaseDAOHiberate是纵向的扩展,横向和纵向都扩展了之后要怎样合二为一呢?这个问题由UserDAOHibernat来解决了

通过看上面的图可以看出UserDAO BaseDAOHibernat是作为一个中间层存在的,最终目的是让UserDAOHibernate拥有DAO接口的CRUD操作。

我们再来看下面这个图,是不是跟上图有着惊人的相似 其实仔细看一下这两个图完全的一样,目的也是复用CRUD操作


那么由此我们可以推出什么呢?这个例子能够得出什么结论呢?

凡是对底层的代码进行扩展都可以通过这种横向和纵向的方式来进行

  • 0026ee50-8001-47c1-9146-24925caf56f0-thumb
  • 大小: 2.9 KB
  • Eb0fb559-9435-4e72-af57-c8f65e350aa4-thumb
  • 大小: 3.5 KB
评论
bluemeteor 2008-08-29   回复
ecsun 写道
泛型 DAO有很多开源项目实现在很好,比如我们熟悉的 Appfuse2.0, SpringSide,以及bba96等,都做了很好的实现,我们完全可以拿来主义嘛.不过做人要厚道啊,拿来用可以,要"守法"啊~~~~~~~~


泛型DAO可以理解为是一种简单、明了的设计模式,没有什么守法的问题.
fantasybei 2008-08-29   回复
sifeng618435 写道
UserDaoHibernate extends BaseDAOHibernate implements UserDao这里是不是有点怪
BaseDAOHibernate 已经实现了UserDao了,
UserDaoHibernate 实现UserDao就不用了吧


BaseDAOHibernate 只实现了DAO,没有实现UserDAO
eccojap 2008-04-04   回复
晕,我的想法跟搂主不谋而合,看来我进步了,呵呵
只不过我的出发点是节省开发时间,自己写个脚本,可以由Bean自动生成
UserDao和UserDAOHibernate
cindy_taozhiang 2008-03-28   回复
seablue_xj 写道
我觉得还是加入service层比较好,如果是能大量使用的业务,责将业务假如到dao层,将dao层设计成富模式,相反,如果不是大量使用的,则将业务设计到service层中,dao层中使用贫血设计模式,




   嗯. 这种想法不错
sifeng618435 2007-12-05   回复
UserDaoHibernate extends BaseDAOHibernate implements UserDao这里是不是有点怪
BaseDAOHibernate 已经实现了UserDao了,
UserDaoHibernate 实现UserDao就不用了吧
seablue_xj 2007-12-01   回复
我觉得还是加入service层比较好,如果是能大量使用的业务,责将业务假如到dao层,将dao层设计成富模式,相反,如果不是大量使用的,则将业务设计到service层中,dao层中使用贫血设计模式,
yangdefeng95802 2007-11-22   回复
realorg 写道
gordon@java 写道
应该是Dao/BaseDAOHibernate是对所有对象crud的操作都能工作的,其中crud某些方法的参数会包括Class cls. UserDao/UserDaoHibernate是专门针对user类的,这个的crud是不需要传入Class的,比如直接给id或者条件就好,不需要User.class,这样的封装对于使用UserDao的代码会好些

Dao可能的方法
public T findById(Class<T> cls,Long id)

对应的UserDao的方法
public User findById(Long userId)


确实,偶也觉得应当这样理解比较合适。
好像有这个!
realorg 2007-11-08   回复
gordon@java 写道
应该是Dao/BaseDAOHibernate是对所有对象crud的操作都能工作的,其中crud某些方法的参数会包括Class cls. UserDao/UserDaoHibernate是专门针对user类的,这个的crud是不需要传入Class的,比如直接给id或者条件就好,不需要User.class,这样的封装对于使用UserDao的代码会好些

Dao可能的方法
public T findById(Class<T> cls,Long id)

对应的UserDao的方法
public User findById(Long userId)


确实,偶也觉得应当这样理解比较合适。
ecsun 2007-11-05   回复
泛型 DAO有很多开源项目实现在很好,比如我们熟悉的 Appfuse2.0, SpringSide,以及bba96等,都做了很好的实现,我们完全可以拿来主义嘛.不过做人要厚道啊,拿来用可以,要"守法"啊~~~~~~~~
williamy 2007-10-10   回复
把基本操作泛化就可以了,ibm developers上好像是03 04的文章
vlinux 2007-10-04   回复
我的做法是首先让Entity全部都实现一个空接口 Entityable

然后定义基Dao接口

public interface BaseDao<T extends Entityable> {

    T find(Object primaryKey);
    void create(T t);
    void modify(T t);
    void delete(T t);

}

然后其他子接口一律继承BaseDao<T>

public interface AccountDao extends BaseDao<Account> {

}



实现的时候BaseDao用BaseDaoImpl去实现
而AccountDao则用AccountDaoImpl extends BaseDaoImpl implements AccountDao去实现

不知道这样的做法是否合理呢~
hyhongyong 2007-09-30   回复
不错,UserDao是接口扩展,BaseDAOHibernate是抽象类扩展。
foxgst 2007-09-30   回复
纵向是实现方式上的扩展,比如采用多种方式实现;横向是功能上的扩展,继承多个接口实现扩展。
yanq12 2007-09-30   回复
请的不够清楚
gordon@java 2007-09-26   回复
应该是Dao/BaseDAOHibernate是对所有对象crud的操作都能工作的,其中crud某些方法的参数会包括Class cls. UserDao/UserDaoHibernate是专门针对user类的,这个的crud是不需要传入Class的,比如直接给id或者条件就好,不需要User.class,这样的封装对于使用UserDao的代码会好些

Dao可能的方法
public T findById(Class<T> cls,Long id)

对应的UserDao的方法
public User findById(Long userId)
jive 2007-09-26   回复
有点模糊,结合点小实例看看

我看好多范型DAO也都是这样设计的
xly_971223 2007-09-06   回复
huangpengxiao 写道
引用
凡是对底层的代码进行扩展都可以通过这种横向和纵向的方式来进行


这个部分的扩展?

BaseDAOHibernate implements DAO?

如果这个算纵向? 横向是.....?

横向是UserDao 对接口进行扩展
huangpengxiao 2007-09-06   回复
引用
凡是对底层的代码进行扩展都可以通过这种横向和纵向的方式来进行


这个部分的扩展?

BaseDAOHibernate implements DAO?

如果这个算纵向? 横向是.....?
发表评论

该博客是同时发布到论坛的,无法评论在论坛已被锁定的帖子

xly_971223
搜索本博客
博客分类
我的相册
C5b0e206-307c-3f61-aa60-9cfd71c61bb3-thumb
u=3528569133,1587051000&gp=38.jpg
共 2 张
最近加入圈子
存档
最新评论