责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式的要点主要是:
1、有多个对象共同对一个任务进行处理。
2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。
3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。
3、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。
2,代码演示:
2.1创建任务处理
public abstract class AbstractLoanJudgeHandler {
//下一级责任链
public AbstractLoanJudgeHandler abstractLoanJudgeHandler;
//设置下一级责任链
public void setNextHandler(AbstractLoanJudgeHandler abstractLoanJudgeHandler){
this.abstractLoanJudgeHandler = abstractLoanJudgeHandler;
}
public Boolean hasNextHandler() {
return !Objects.isNull(abstractLoanJudgeHandler);
}
public abstract Map<String,Object> resolve(JSONObject jsonObject);
}
2.2:创建个性化的任务处理(只是一个个性化处理,要另外个性化都是使用这样的写法)
/**
* 贷款控制处理类,不同控制不同实现,设置下一个处理器
* Created by PengWX on 2019/4/10.
*/
@Component
public class AnHuiBankAbstractLoanJudgeHandler extends AbstractLoanJudgeHandler {
@Autowired
private ICustomerService customerService;
@Autowired
private LoanApplyMapper loanApplyMapper;
@Autowired
private ICodeLibraryService codeLibraryService;
@Override
public Map<String, Object> resolve(JSONObject jsonObject) {
if (Objects.isNull(jsonObject)) {
return null;
}
//贷款控制,同一客户同一银行(安徽工行)配置控制只能发起一笔有效的贷款,有贷款申请、修改、作废流程中或审批通过的数据
CodeLibrary codeLibrary = codeLibraryService.queryLibraryNoException("anHuiUniqueLaonControl", jsonObject.getString("coBankId"));
Map<String, Object> map = new HashMap<>();
if (java.util.Objects.nonNull(codeLibrary)) {
LoanApplyExample example = new LoanApplyExample();
example.createCriteria().andCustomerIdEqualTo(jsonObject.getLong("customerId"));
List<LoanApply> loanApplyList = loanApplyMapper.selectByExample(example);
if (CollectionUtils.isNotEmpty(loanApplyList)) {
CustomerBaseInfo customer = customerService.getCustomer(jsonObject.getLong("customerId"));
map.put("customer", customer);
return map;
}
}
if (hasNextHandler()) {
map = abstractLoanJudgeHandler.resolve(jsonObject);
return map;
}
return null;
}
}
2.3:责任链调用
/**
* 贷款控制链
* Created by PengWX on 2019/4/10.
*/
@Service("loanChainService")
public class LoanChainServiceImpl implements ILoanChainService {
@Autowired
private AbstractLoanJudgeHandler anHuiBankAbstractLoanJudgeHandler;
@Override
public Map<String, Object> isContinueLoanProcess(JSONObject jsonObject) {
//不同控制处理器需要各自创建,并设置下一个处理器
// anHuiBankAbstractLoanJudgeHandler.setNextHandler(anHuiBankHandler11);
Map<String, Object> map = anHuiBankAbstractLoanJudgeHandler.resolve(jsonObject);
return map;
}
}
这边使用的业务是a银行需要控制,或许一会b银行需要控制,如果进不来a银行规则,那就走b银行规则.假设a,b银行有规则校验不通过就提示出去.大概使用的场景就好像dingding请假审批一样.当然也可以使用管道模式.