接口 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加上相應的代碼即可