场景
最近公司在搞新OA系统,有个比较大的需求就是在线生成合同模板的PDF文件。合同流程大概是这样的:
而生成合同PDF文件这个需求说来也不复杂,其实就是这样:
总的来说就是查询数据,调用接口,保存流,完事。
但其中因为事业部不同,需要填充的参数肯定也不同,而且中间可能会有附加操作。也就是说除了这个需求流程绝对不变,其他中间代码可能会不一样。那这时候,模板设计模式就上场了。
模板设计模式
我理解的模板设计模式其实很简单,就是一个Abstract类包含了公用函数,具体类去实现这个抽象类,override抽象类中的方法就行了,大概实现如下:
Abstract类:
public abstract class AbstractContractCreateAction{
protected abstract void fillContractParam(Map<String,String> fillMap, Map<String, String> tableMap){}
}
protected abstract void chooseContract(int contractType){}
public String execute(RequestInfo requestInfo){
getAllDataFromTable();//从表格获取所有数据
//..其他操作
chooseContract();
//..其他操作
fillContractParam();
//..其他操作
createPDF();//保存流
}
继承Abstract类:
public class LawContractCreateAction extends AbstractContractCreateAction{
@Override
protected abstract void fillContractParam(Map<String,String> fillMap, Map<String, String> tableMap){
tableMap.foreach();
fillMap.foreach();
//...blablabla
}
@Override
protected abstract void chooseContract(int contractType){
switch(contractType){
case 0:
break;
case 1:
break;
case 2:
break;
default:
break;
}
//....blablabla
}
}
}
这样就大大减少了代码的重复性,关键是IDEA就不会有那么多的黄色波浪线了(原先是写好一个事业部后直接复制文件,再改其中某些函数,这实在有点傻)。并且以后如果流程变了,就只用改Abstract类就可以了。