前言
最近有个周边系统对接我们系统进行投保的需求,周边系统会将客户填写好的投保单资料推送到我们系统,我们出完单后将单号返回给他们。此次对接的保险险种有多个,每个数据都有需要特殊处理的地方,但是他们的流程是一样的,投保单校验、入库、提交审核、自动审核等,最大的区别在于不同的险类他们的风险信息不一样,所以需要我们特殊处理。
概述
根据上图业务逻辑,可以看到整个流程是一致的,而且有很多模块都是可以复用,如果后续还有其它特殊险类接入的话,那都要复制黏贴写一套,拓展性和后期维护成功较高。所以可以引入模板方法设计模式,抽象一个父类,将整个业务逻辑放到父类中,特殊处理模块交由子类进行实现,可以起到延时加载的作用。
在上图中,抽象类中有一个业务方法入口,该方法调用了校验方法、数据特殊处理方法、数据入库方法、提交审核方法、自动核保方法;其中数据特殊处理是一个抽象方法,交由子类进行实现,其它方法都已完成业务逻辑编写。
子类继承了父类后,只需要编写数据特殊处理这个抽象方法即可,其它的业务逻辑都在父类写好了,而且流程也不需要你动。
测试用例
模板方法:
我们在这里定义一个模板类,定义了数据校验方法、数据特殊处理、数据入库、提交审核、自动审核,其中除了数据特殊处理方法为抽象方法外,其它方法都有其具体的业务实现,数据特殊处理方法留到子类,由不同的子类根据自身业务进行实现。
public abstract class BusinessTemplate {
public String execute(String data){
this.checker(data);
this.previousHandle(data);
this.proposalSave(data);
this.submit(data);
this.autoAudit(data);
return "成功";
}
/**
* 数据校验
* @param data
*/
public void checker(String data){
System.out.println("数据校验");
}
/**
* 数据特殊处理
* @param data
*/
public abstract void previousHandle(String data);
/**
* 数据入库
* @param data
*/
public void proposalSave(String data){
System.out.println("数据入库");
}
/**
* 提交审核
* @param data
*/
public void submit(String data){
System.out.println("提交审核");
}
/**
* 自动审核
* @param data
*/
public void autoAudit(String data){
System.out.println("自动审核");
}
}
子类实现
不同业务类型的子类实现不同的数据特殊处理逻辑,由于其它流程共用的,直接使用父类的方法即可。
public class AccidentBusiness extends BusinessTemplate {
@Override
public void previousHandle(String data) {
System.out.println("意外险数据特殊处理");
}
}
public class HealthBusiness extends BusinessTemplate {
@Override
public void previousHandle(String data) {
System.out.println("健康险数据特殊处理");
}
}
测试
public static void main(String[] args) {
AccidentBusiness accidentBusiness=new AccidentBusiness();
accidentBusiness.execute("投保数据");
System.out.println("-------------");
HealthBusiness healthBusiness=new HealthBusiness();
healthBusiness.execute("投保数据");
}
总结
模板方法使用于有相同逻辑流程上,一般还会配合其它的设计模式,如简单工厂模式将这些类维护起来,在抽象方法中加上责任链模式或者策略模式等等。如何使用还要根据我们的业务来定制化,需要大概预判后续可能发生的场景。