论坛首页 Java企业应用论坛

关于 DAO 接口设计的思考

浏览 23938 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-10-11  
需求: 现在要设计 3 个 DAO 分对 Wind, Horse, Cow 进行增、删、改以及一些其他操作。

设计一:
Public interface WindDao {
    public void create(Wind obj);
    public void delete(Wind obj);
    public void update(Wind obj);

    public void other(Wind obj);
}

Public interface HorseDao {
    public void create(Horse obj);
    public void delete(Horse obj);
    public void update(Horse obj);

    public void other(Horse obj);
}

Public interface CowDao {
    public void create(Cow obj);
    public void delete(Cow obj);
    public void update(Cow obj);

    public void other(Horse obj);
}


设计二:

Public interface BaseDao {
    public void create(Object obj);
    public void delete(Object obj);
    public void update(Object obj);
}


Public interface WindDao extends BaseDao {
    public void other(Wind obj);
}

Public interface HorseDao extends BaseDao {
    public void other(Horse obj);
}

Public interface CowDao extends BaseDao {
    public void other(Horse obj);
}


疑惑:
    采用设计一: 发现增、删、改 这些方法重复了。
    采用设计二: 发现 WindDao 不但可以对 Wind 进行增、删、改操作,
                 而且可以对其他任意对象进行增、删、改操作。似乎违反了OO的设计原则。

    各位大侠, 应该如何设计会比较合适些 ?
   发表时间:2006-10-11  
public interface BaseDao<T> {
    public void create (T t);
    public void delete (T t);
    public void update (T t);
}

public interface WindDao extends BaseDao<Wind> {
    public void other (Wind wind);
}
0 请登录后投票
   发表时间:2006-10-11  
对。就是用1.5的泛型,我经常也这么干
0 请登录后投票
   发表时间:2006-10-12  
嗯,好主意 !

非常感谢各位的回复.
0 请登录后投票
   发表时间:2006-10-12  
第一次见这种写法,我也试试
0 请登录后投票
   发表时间:2006-10-12  
除了用泛型,用反射可以吗???
0 请登录后投票
   发表时间:2006-10-12  
反射的话应该也可以,不是这种类型的就抛个异常出来,不过这样的话,每个DAO实现都要重复判断,所以最好写一个基类把这些东西放在基类里面,to楼上的几位,不是什么项目都可以用5.0的
0 请登录后投票
   发表时间:2006-10-13  
反射虽然可以, 但是用反射性能比较低,我觉得如非必要最好还是不要用反射。
0 请登录后投票
   发表时间:2006-10-13  
不是jdk1.5就不好解决这些问题,哪个解决反感都有点毛病
1 请登录后投票
   发表时间:2006-10-13  
刑天战士 写道
反射的话应该也可以,不是这种类型的就抛个异常出来,不过这样的话,每个DAO实现都要重复判断,所以最好写一个基类把这些东西放在基类里面,to楼上的几位,不是什么项目都可以用5.0的


如果不能用5.0,就用设计一。我的设计可以看成是用模板简化了设计一。WindDao和HorseDao等操作的对象是不一样的,所以不能因为方法名一样,就认为是重复的操作。

设计二什么时候有价值?如果有程序只需要依赖BaseDao,而不需要依赖具体实体类的DAO接口,BaseDao就有价值了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics