最近在搞开发的时候原公司的框架有点疑问希望大家能指点下,情况是这样的公司在开发的时候用mvc形式,其中有dao层,但我有点不明白的是每model的数据库操作都 是一个类,但每个这样的类他都在一个空间有个接口相对就的继承,我就不明白了这样做有什么好处那?
比如,我有个user的model现在要存到数据库里 那就会有个比如接口的空间会有个 user_interface{   insert(user user);
}
然后在dao的类 user_dao:user_interface{
    public void insert(User user){}...
}如果有别的model 也是采用这样的方式 我现在不理解的是 这样做有什么特别意义么?而每次在dao的类中加入方法的时候相应的interface也必须加上,这个使用的时候好像用了反射机制,就是不明白这样做有什么好处?希望大家指点下

解决方案 »

  1.   

    不会是用什么ORM工具生成的吧。
      

  2.   

    如果DAO层有多于一个实现,比如说为SQL Server和Oracle各写了一个实现。那么使用接口可以方便地在调用层灵活切换而无需修改上一层的代码。
      

  3.   

    不是吧,因为我们开发都是用这个模式的啊,这个模式有什么优势么?主要是每个dao的类都有个接口我就不是很明白了有什么好处啊,难道就是为了其它数据库准备的么?要不还有什么好处那?
      

  4.   

    而每次在dao的类中加入方法的时候相应的interface也必须加上,这个使用的时候好像用了反射机制,1. 你把这个关系弄反了,是DAO类都实现了Interface中定义的接口方法。
    2. 面向接口的开发,可以有效实现层间的解耦,同时也方便测试。
      

  5.   

    这个绝对是没有理解接口和反射的本质,而乱用技术。
    接口是方便了拓展,但是这样的接口最起码也要弄个泛型,没必要搞那么一大堆接口出来。
    反射是可以实现调用接口里的方法,但是完全没必要。把类对象直接转换为接口就可以使用接口的方法了,不需使用反射。而且反射会有性能问题,必须在需要的情况下才能使用。
    接口的使用,简单写个例子,自己的理解。
    interface ITest
    {
    void Test();
    }
    class ClassTest:ITest
    {
    void Test()
    {
    ……;
    }
    }
    使用的时候:
    ITest test = (ITest)new ClassTest();
    test.Test();这样以后有需求,可以再写一个ClassTestII类。
    class ClassTestII:ITest
    {
    void Test()
    {
    ……;
    }
    }
    调用部分只需要把类名改了就好了。
    ITest test = (ITest)new ClassTestII();
    test.Test();使用正确,最终应该是这个样子的。
      

  6.   

    我也觉得没必要每个操作类都有相应的接口,可能是为了以后扩展mysql之类的不同的数据库吧
    我还以为有什么特别的功能那,看的很高深的样子,最主要的是我 晕了
    哈哈 汗!!
      

  7.   

    刚才在群里请教了同样的问题,大家讨论说对于dao层的类只需要继承几个接口就行了没必要这样,但我还是不明白啊,针对dao的操作类那么多,比如增、删、改、查  这个可以继承一个接口就可以了,但如果每个操作类都有特殊的查询要求,那我们怎么办?几个接口是不能满足要求的,难道就要像我们公司这种模式么?每个类写个接口,就是为了使用接口么?
      

  8.   

    大家看看我这样写接口和数据操作类行么?
    Interface IDAO{
    Insert (Object obj);
    }
    public class User:IDAO{
    public void Insert(Object  obj){
      User user=(User)obj;
     String sql=”insert into user  values(“user.name+”,”+user.pwd+”)”;
    }
    }
      

  9.   

    这个要看调用的地方是怎么写的,如果是直接去New一个对象来调用 接口的意义就不能体现
    如果使用
    public static InterFace 来调用 就能体现接口的意义了
      

  10.   

    为了扩展。如果你们的项目里用了AOP,那些成这样的接口就是为了扩展的灵活性。
    比如一个类你用了class UserDao: IUserDao{}但是并没有UserDao dao = new UserDao();
    而是IUserDao dao ,并给dao设置了相应的setter和getter,代码中并没有给出具体的实例化。
    使用AOP进行dao的注入,假设是<component id="someDao" type ="xxx.xxx.xxx.UserDao"/>
    然后有一天你要改了,UserDao过时了,有个小伙子写了个class AccountDao:IUserDao{}
    现在要改项目了,你说你愿意改代码,然后编译整个工程呢(UserDao dao = new UserDao();改成AccountDao dao = new AccountDao();) 还是只编译AccountDao所在的工程然后改改AOP配置文件?(<component id="someDao" type ="xxx.xxx.xxx.UserDao"/>改成<component id="someDao" type ="xxx.xxx.xxx.AccountDao"/>即可)AOP原理涉及到了反射,这楼上都说的很清楚了。