接口 Interface
       没有方法体,只有抽象方法, implements接口时候必须实现该接口所定义的所有的抽象方法
       可以implements多个接口 用,号间隔.
抽象类  Abstract
       可以有一部份实现方法,也可以有抽象方法,
       只可以extends一个抽象类

二者都是不可实例化


假设我们需要做一个支持多种数据库的项目,但是数据库之间有存在的差别,难道我们就要为不同的数据库开发不同的系统?答案是NO!
我们可以将多种数据库所有的方法抽象出来,写成一个个的方法组合到一个接口中
然后有多少种数据库我们就写几个这样的类实现这个接口

具体如下:
我们首先把所有的抽象方法组合到一个DataOperate的接口中
public interface DataOperate{
      Connection createConn();     /*建立连接*/
       void closeConn();               /*关闭连接*/
       ResultSet getRs();              /*返回结果集*/
       boolean   exec();               /*执行语句*/
       boolean   isClose();         
/*公共方法 查看连接状态*/
}

定义完接口 我们再创建一个抽象类 来实现公共的方法isClose()
public abstract class AbstractDataOperate implements DataOperate{
     public Connection createConn(){
            return null;
     }
     public void closeConn(){
     }
     public ResultSet getRs(){
            return null;
     }
     public boolean exec(){
            return fasle;
     }
     /**
     *公共方法的实现
     **/

     public boolean isClose(){
        if(conn!=null)
             return false;
        else
            return true;
     }
   
}

接下来我们分别写3个类OracleDataOperate,SqlServerDataOperate,MySqlDataOperate继承AbstractDatOperate具体实现方法 这里不再叙述

好了 现在最后一步 写一个工厂方法来统一得到数据库操作类的实例
public class DataOperateFactory{
     public static final int OracleKey=1;
     public static final int SqlServerKey=2;   
     public static final int MySqlKey=3;
    
     public static int DbType =OracleKey;
     private static DataOperate db;
    
     public static DataOperate getInstance(){
           if(db==null){
                   if(DbType==OracleKey)
                        db=new OracleDataOperate();
                  else if(DbType==SqlServerKey)
                        db=new SqlServerDataOperate();
                  else if(DbType==MySqlKey)
                        db=new MySqlDataOperate();
          }
         return db;
     }
}

Ok 到此所有工作都完成 来测试吧
public class  MyTest{
  public static void main(String args[]){
      
      DataOperate db=AbstrctDataOperate.getInstance();
      db.createConn();

   }
}


在MyTest类里根本没有出现OracelDataOperate、MysqlDataOperate等的影子,这就是接口的威力。客户端不必针对OracelDataOperate等写不同的代码,它只关心DataOperate即可,具体要取那个类的逻辑就由DataOperateFactory负责了。
如果还有新的数据库添加的话 只需要象OracleaDataOperate那样 再写一个这样类 继承AbstractDataOperate类 然后在工厂类里DataOperateFactory加上相应的代码即可


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 11, comments - 1, trackbacks - 0, articles - 0

Copyright © 射手座的我 双子座的她