参考Spring模板模式和回调接口的一个应用

来源:互联网 发布:数据分析师 培训 武汉 编辑:程序博客网 时间:2024/05/18 01:18

1.假设有如下的业务方法类:

import java.util.Map;/** * 业务方法 * @author yaol * */public class TestService {   BaseDao dao = new BaseDao();   public Object findById(Map params){   /**    * 检测参数    */   Object obj =null;   String id = null;   try{   id = (String)params.get("id");   }   catch(Exception e){   e.printStackTrace();   return error();   }   /**    * 获取结果    */   try{   obj = dao.findById(id);   return ok();   }   catch(Exception e){   e.fillInStackTrace();   return error();   }   }      public Object findByPage(Map params){      Object obj =null;   int pageNo,pageSize;   /**    * 检测参数    */   try{   pageNo =(Integer) params.get("pageNo");   pageSize = (Integer)params.get("pageSize");   }   catch(Exception e){   e.printStackTrace();   return error();   }   /**    * 获取结果    */   try{   obj = dao.findByPage(pageNo, pageSize);   return ok();   }   catch(Exception e){   e.fillInStackTrace();   return error();   }   }      public Object error(){   return "error";   }   public String ok(){   return "ok";   }}/** * Dao * @author yaol * */class BaseDao{public Object findById(String id){return null;}public Object findByPage(int pageNo,int pageSize){return null;}}


应该可以看出findById和findByPage结构是完全相同的.
先校验参数合法性,再根据参数获取结果,并且分别做异常处理.
如果业务方法增加的话,程序中会充斥了大量的异常处理代码.
如何减少这些重复的异常处理代码呢?

2.引入模板模式和回调接口

代码如下:

/** * 回调接口 * @author yaol * */interface ServiceCallback {/** * 验证参数合法性以及设置参数 * @param map */public void checkAndSetParamters();/** * 获取数据 * @param map * @return TODO */public Object getResult() throws Exception;}/** * 业务模板 * @author yaol * */public class ServiceTemplate {public Object execute(ServiceCallback callback) {try {callback.checkAndSetParamters();} catch (Exception e) {e.printStackTrace();return error();}try {Object obj = callback.getResult();return ok();} catch (Exception e) {e.fillInStackTrace();return error();}}public Object error() {return "error";}public String ok() {return "ok";}}


3.改写业务方法类

/** * 改写后的业务方法类 * @author yaol * */public class TestService2 extends ServiceSupport{public Object findByPage(final Map params) {return getServiceTemplate().execute(new ServiceCallback() {int pageNo, pageSize;public void checkAndSetParamters() {pageNo = (Integer) params.get("pageNo");pageSize = (Integer) params.get("pageSize");}public Object getResult() throws Exception {return getDao().findByPage(pageNo, pageSize);}});}public Object findById(final Map params) {return getServiceTemplate().execute(new ServiceCallback() {String id = null;public void checkAndSetParamters() {id = (String)params.get("id");}public Object getResult() throws Exception {return getDao().findById(id);}});}public BaseDao getDao() {return new BaseDao();}}/** * ServiceSupport * @author yaol * */class ServiceSupport{public ServiceTemplate getServiceTemplate() {return new ServiceTemplate();}}
/*这里的ServiceSupport和Spring提供的XXXDaoSupport相似,而getServiceTemplate()类似于getHibernateTemplate()方法.阅读优秀的开源代码对程序员是大有裨益的.*/
原创粉丝点击