|
这样做完后,自己感觉很不满意.因为两个相似的功能,写了两遍代码:两个action,service,还有两个页面.很笨. 如果以后需求增加,再写其它的excel格式岂不是很惨.又要用cp法了.初步的思路是只一个action和一个页面. 经过思索,发现,只有service层的 public void add(List excelDatalist); public List sameList(List excelDatalist); public void deleteSame(List excelDataList); 三个方法是不同的.
那么在action中可以根据参数生成不同的service,执行不同的service中的service方法.可以用工厂方法生产出不同的service.思路有了,开干.
首先把这三个方法提到一个接口里来.
public interface CommonUploadService { public void add(List excelDatalist); public List sameList(List excelDatalist); public void deleteSame(List excelDataList); } |
原为的service就变成这样
public interface CITyDayService extends CommonUploadService{ public List findByCityAndDate(String cITy,Date date); }
public interface ZhbTCITyDayForecastService extends CommonUploadService{ public List findByCityAndDate(String cITy,Date date); } |
实现类不用变.
工厂方法:
| public class UploadServiceFactory {
private static CommonUploadService cus;
private static final String cityDayService = "com.xxx.datacenter.upload.service.CITyDayServiceImpl";
private static final String foreCastService = "com.xxx.datacenter.upload.forecast.service.CITyDayServiceImpl";
private UploadServiceFactory() { }
public static CommonUploadService getInstance(String type) { try { if ("daily".equals(type)) { Class cls = Class.forName(cITyDayService); cus = (CommonUploadService) cls.newInstance(); } if ("forecast".equals(type)) { Class cls = Class.forName(foreCastService); cus = (CommonUploadService) cls.newInstance(); } } catch (Exception e) { e.printStackTrace(); } return cus; } } |
改造后的action
/* 导入表 */ // CityDayService cds = new CITyDayServiceImpl();//这里有不同 可以用工厂方法,根据参数type不同构造出 String type = request.getParameter("type"); CommonUploadService cds = UploadServiceFactory.getInstance(type); ImpExcelData impExcelData = new ImpExcelData(filePath, 0); try { List list = impExcelData.getData(); List<CITyDay> sameList = cds.sameList(list);//这里有不同
//boolean isOk = cds.checkExcel(list); if (sameList.size()>0) { request.setAttribute("sameList", sameList); request .setAttribute("echo", "以下数据有重复,是否覆盖"); return mapping.findForward("upload"); } else {
cds.add(list);//这里有不同 } System.out.print(""); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } |
这样一个action就可以搞定了. 如果以为要增加新格式的excel文件,只实现CommonUploadService方法,改造一下工厂类就ok了.
总结: 以后遇到功能类似的需求,可以把接口相同,但实现不同的方法提到共的提口来.然后用工厂方法生成不同的实例. 运用面向对象的多态的性能.就可以简化开发. 设计模式关暂在于实践.光看书本是不行的.有什么不对的地方,请多多指点. 上一页 [1] [2] [3] |