下面是我们一般首先会使用的方式,使用if else进行,判断,这样使用系统 难以维护,难以扩展,不妨你增加一种查询,或者一种数据库试试???? public class SearchAction(){ public Vector searchData(string ActionType,String DbType){ String SQL=""; if(ActionType.equal("查找客户信息")){ //如果是查询客户信息,拼SQL语句从客户表中读取数据 SQL="select * from Customer "
查询共同接口: public interface searchDB{ public Vector searchFromDB(String SQL) } Oracle数据库的查询实现 public class searchDBOracleImpl{ public Vector searchFromDB(String SQL){ //从总部数据库读取,数据库为Oracle String connect_string ="jdbc:oracle:thin:hr/hr@localhost:1521:HRDB"; DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
} } Sybase数据库的查询实现 public class searchDBSysbaseImpl{ public Vector searchFromDB(String SQL){ //从分公司数据库读取,数据库为Sysbase String connect_string ="jdbc:sybase:Tds:cai/cai@192.168.1.12:1521:FIN"; DriverManager.registerDriver (new com.sybase.jdbc.SybDriver()); ResultSet rset = stmt.executeQuery (SQL); ............................. ............................
} }
这样在我们的查询中就可以使用接口searchDB,但是创建有是一个问题,因为我们不能 静态的确定,查询的数据库类型,必须动态确定,于是我们又想到使用简单工厂方法, 来分别创建这里的具体实现,根据类别,创建 public class searchFactory{ public static searchDB createSearch(int DBType){ if(DBType.equal("oracle")){ return searchDBOracleImpl(); }else if(DBType.equal("sybase")){ return searchDBSysbaseImpl(); } } } 于是我们的查询代码可以改变为这样了; public class SearchAction(){
public Vector searchData(string ActionType,String DbType){ String SQL=""; if(ActionType.equal("查找客户信息")){ //如果是查询客户信息,拼SQL语句从客户表中读取数据 SQL="select * from Customer " searchDB obj=searchFactory.createSearch(DbType); return obj.searchFromDB(SQL);
public abstract class searchAction{ searchDB obj; //两个步骤 public searchDB createSearchImple(int DbType){ return searchFactory.createSearch(DbType); } public abstract String createSQL();
//查询过程,最后返回结果 public vector searchResult(int DbType){ obj=createSearchImple(DbType); return obj.searchFromDB(createSQL()) } }
//我们客户查询,操作 public class searchCustomerAction{ public String createSQL(){ return "select * from Customer" } } //我们的帐户查询操作 public class searchAccountAction{ public String createSQL(){ return "select * from account" } }
这样我们的查询编程简单的创建SQL语句,我们应该再创建一个工厂方法, 来完成创建它们 public class actionFactory{ public static searchAction ceateAction(int actionType){ if(actionType.equal("customer")){ return searchCustomerAction(); }else if(actionType.equal("account")){ return searchAccountAction(); } } } 这样我们把查询操作的过程进行了抽象,定义了步骤,和具体过程,经过我们的两次改变 把抽象部分和实现部分进行分离,使他们都可以独立的变化,增强灵活性。 我们再看当初查询实现,现在经过这两次的地修改,变成了什么模样?如下:
public class SearchAction(){ public Vector searchData(string ActionType,String DbType){ searchAction action=actionFactory.ceateAction(ActionType); return action.searchResult(DbType); } 现在假如增加一个数据库类型,将会改变那些??,如果增加一种查询操作需要改变那些???