1. 业务场景
通过程序,将运营人员线下签约模式转化为线上签约模式,在线上签约过程引入第三方合同验证平台。
2. 传统处理/责任链模式
2.1 传统模式
需要关注验证的每一步是否成功,如果成功才会继续向下执行,如果不成功需要返回错误信息。代码略。
2.2 责任链模式
// 创建责任链各个节点实例
CreateContractTest createContractTest = new CreateContractTest();
ApplyCertificateTest applyCertificateTest = new ApplyCertificateTest();
RecordContractTest recordContractTest = new RecordContractTest();
CompletionContractTest completionContractTest = new CompletionContractTest();
// 指定层级传递关系
createContractTest.setSuccessor(applyCertificateTest);
applyCertificateTest.setSuccessor(recordContractTest);
recordContractTest.setSuccessor(completionContractTest);
createContractTest.handleResult(ContractSignCodeEnum.Ready.getCode());
2.3 什么是责任链模式
https://blog.csdn.net/weixin_33861800/article/details/91931466 (喜欢这类大神的讲解,形象便于理解,有兴趣的同学可以看看)
3. SpringBoot引入责任链模式
3.1 定义抽象处理类
/**
* @Description [责任链模式执行判断抽象类]
* @Date 2019/1/31 11:47
*/
public abstract class AbstractJudgmentTest {
/**
* 下一节点实例
*/
private AbstractJudgmentTest successor;
public AbstractJudgmentTest getSuccessor() {
return successor;
}
public void setSuccessor(AbstractJudgmentTest successor) {
this.successor = successor;
}
/**
* 获取处理结果
* @return
*/
public abstract void handleResult(Integer currentState);
}
3.2 定义每个节点实现方法
/**
* @Description [申请企业数字证书]
* @Date 2019/1/31 11:52
*/
@Component
public class ApplyCertificateTest extends AbstractJudgmentTest {
private Logger logger = LoggerFactory.getLogger(ApplyCertificateTest.class);
@Override
public void handleResult(Integer currentState) {
if (currentState.equals(ContractSignCodeEnum.Certificate.getCode())) {
logger.info("========执行申请企业数字证书逻辑========");
} else {
getSuccessor().handleResult(currentState);
}
}
}
3.3 创建测试用例
@Test
public void test() {
// 创建责任链各个节点实例
CreateContractTest createContractTest = new CreateContractTest();
ApplyCertificateTest applyCertificateTest = new ApplyCertificateTest();
RecordContractTest recordContractTest = new RecordContractTest();
CompletionContractTest completionContractTest = new CompletionContractTest();
// 指定层级传递关系
createContractTest.setSuccessor(applyCertificateTest);
applyCertificateTest.setSuccessor(recordContractTest);
recordContractTest.setSuccessor(completionContractTest);
createContractTest.handleResult(ContractSignCodeEnum.Ready.getCode());
}
4. 责任链模式优势
1. 解耦请求者和发送者。
2. 简化具体责任对象,因为它不知道链的结构,只要处理自己对应的工作即可。
3. 可以动态的增加或者删除责任对象。