是不是简单一些,如果增加一个新的数据库,对我们只需增加一个新的数据库实现便可,老的代码,不需改变,这样便实现开-闭原则(Open-closed原则),在我们的查询查询中使用的是接口,这就是设计模式的原则,针对接口进行编程,并且使用聚合,而不是直接的继承大家,可以考虑使用继承来完成该工作怎样实现。上面是把实现进行分离,实现可以动态变化!
我们把查询的操作的具体数据库实现进行了分离,增强了灵活性,但是我们的查询。仍然使用了if else这样仍然不易进行扩展,于是我们进行抽象一个查询操作的过程,把它分成几个具体步骤,创建SQL语句,发送到数据库,执行查询,返回结果。
它们虽然是不同的查询,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 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);
}