1.背景
之前工作做过几个需求:
1.1类似**险种,**产品。功能类似,例如给产品/险种上设置**责任。两者区别就只在于最后的查询不一致,我们可以使用模版方法
1.2不同机构有类似的处理,例如针对一些字典项相同处理,多选参数的处理之类。多个机构的区别在于底层查询方法不同
1.3;不同公告,相同的时间校验,是否开启**功能处理等。不同在于底层获取的数据不一致
2.模版方法
做了一点小修正,注意父类的方法要用final修饰,不允许被继承重写
2.1 模版方法的抽象父类,对于背景中,该类表示险种,产品抽象父类,不同机构的抽象父类,不同公告的抽象父类。
公用方法在父类中写,子类中完成非this调用的方法。也就是我们abstract修饰的方法getSpecialList(AgencyReq req)
public abstract class AbstractAgencyService {
public final List<? extends AgencyRes> getAgencyList(AgencyReq req){
this.checkTime(req);
this.parseParam(req);
List<? extends AgencyRes> result = getSpecialList(req);
this.parseResult(result);
return result;
}
private void parseResult(List<? extends AgencyRes> result) {
//todo 处理返回结果,例如状态值转化,0->不可用,1->可用
}
protected abstract List<? extends AgencyRes> getSpecialList(AgencyReq req) ;
private void parseParam(AgencyReq req) {
// todo 处理参数,例如参数转化,把String类型转数据
}
//公用处理时间
private void checkTime(AgencyReq req) {
//todo 处理参数中的时间
}
}
2.2 子类实现演示
这是两个子类,分别继承了抽象类,并完成了方法重写
/*
陈旧机构
*/
@Service
public class CjAgencyServiceImpl extends AbstractAgencyService {
@Override
protected List<? extends AgencyRes> getSpecialList(AgencyReq req) {
//todo mapper调用数据查询自己特殊的机构查询方式
return null;
}
}
/**
* 创新机构
*/
@Service
public class CxAgencyServiceImpl extends AbstractAgencyService {
@Override
protected List<? extends AgencyRes> getSpecialList(AgencyReq req) {
//todo mapper调用数据查询自己特殊的机构查询方式
return null;
}
}
2.3 抽象方法的使用
以上模版我们使用在具体业务类中,通过applicationcontext上下文和我们对应的实现类注册到spring的名称来获取具体实现,最后调用方法即可完成
package com.zs.account.service.Impl;
import com.zs.account.POJO.AgencyReq;
import com.zs.account.POJO.AgencyRes;
import com.zs.account.service.AbstractAgencyService;
import com.zs.account.service.AgencyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 具体业务实现类
*/
@Service
public class AgencyServiceImpl implements AgencyService {
@Autowired
private ApplicationContext context;
/**
* 这个方法做个说明,这个是属于业务类,我们可以做很多跟业务相关,而返回的AgencyRes,不一定是我们需求,我只是为了简单这样操作了
* 通常这个返回会跟业务相关,而我们的子实现只是业务中的一环,你可以在该业务操作中做跟业务相关逻辑
*
* @param req
* @param type
* @return
*/
@Override
public List<? extends AgencyRes> getList(AgencyReq req, String type) {
//todo 通过类型转化,获取到对应service的名称,从而拿到对应的子实现类serviceImpl
AbstractAgencyService childServiceImpl = context.getBean(type, AbstractAgencyService.class);
List<? extends AgencyRes> agencyList = childServiceImpl.getAgencyList(req);
return agencyList;
}
}