定义
为请求创建一个接收此次请求对象的链。
类型
行为型
适用场景
①、一个请求的处理需要多个对象当中的一个或几个协作处理。
优缺点
优点:
①、请求的发送者和接收者(请求的处理)解耦。
②、责任链可以动态组合。
缺点:
①、责任链太长或者处理时间过长,影响性能。
②、责任链有可能过多。
代码实现
案例:前段时间,在阿里云买个域名过期了,但是不想续费,想重新买一个新的。然后就重新买了一个。还以为不用重新备案,没想到,顶级域名是需要重新备案的。于是重新提交备案信息一步一步审批。首先是阿里云审批,然后阿里云审批通过就会提交给管局进行审批。
假设,阿里云是对备案主体信息的审批,管局是对备案用户信息的审批。
public class Record {
private String webName;
private String subjectInfo;
private String identityInfo;
public String getWebName() {
return webName;
}
public void setWebName(String webName) {
this.webName = webName;
}
public String getSubjectInfo() {
return subjectInfo;
}
public void setSubjectInfo(String subjectInfo) {
this.subjectInfo = subjectInfo;
}
public String getIdentityInfo() {
return identityInfo;
}
public void setIdentityInfo(String identityInfo) {
this.identityInfo = identityInfo;
}
}
上面就是备案所需要的信息,代码写的很简单,实际真正的备案是需要填写很多信息的。
创建审批的接口。
public abstract class Approver {
protected Approver approver;
public void setNextApprover(Approver approver) {
this.approver = approver;
}
public abstract void deploy(Record record);
}
setNextApprover()是设置下一个审批者。
deploy()提交到下一个审批者。
创建阿里云的审批者
public class SubjectApprover extends Approver {
@Override
public void deploy(Record record) {
if (StringUtils.isNotBlank(record.getSubjectInfo())) {
System.out.println(record.getWebName() + ": 主体信息校验通过");
// 看看是否有下一个审批人
if (approver != null) {
approver.deploy(record);
}
} else {
System.out.println(record.getWebName() + ": 主体信息校验失败,流程结束");
return;
}
}
}
因为阿里云的审批者只对主体信息进行校验,所以这里就只用校验subjectInfo这个属性就行了。这里校验逻辑写的很简单,就是非空判断。如果校验通过,就提交到下一个审批人。如果校验失败,则直接结束整个流程。
创建管局的审批者
public class IdentityApprover extends Approver {
@Override
public void deploy(Record record) {
if (StringUtils.isNotBlank(record.getIdentityInfo())) {
System.out.println(record.getWebName() + ": 身份信息校验通过");
// 看看是否有下一个审批人
if (approver != null) {
approver.deploy(record);
}
} else {
System.out.println(record.getWebName() + ": 身份信息校验失败,流程结束");
return;
}
}
}
管局校验同阿里云校验逻辑,知识校验的属性不同。
编写测试类
public class MainTest {
public static void main(String[] args) {
// 阿里云的审批人
Approver aliyunApprover = new SubjectApprover();
// 管局的审批人
Approver guanjuApprover = new IdentityApprover();
Record record = new Record();
record.setWebName("清风的博客");
record.setSubjectInfo("学习 分享 个人博客");
record.setIdentityInfo("500228********2222");
// 设置下一个审批人
aliyunApprover.setNextApprover(guanjuApprover);
aliyunApprover.deploy(record);
}
}
输出结果:
C:\android\java\jdk1.8\bin\java.exe
清风的博客: 主体信息校验通过
清风的博客: 身份信息校验通过
真正的备案流程是非常麻烦的,校验逻辑那是相当复杂的。只要稍微不和规定,就给你打回来重新填写提交了。想想博主备案的时候,真是弄了好几次。等审批下来,都快一个月了。
相关源码
1. Java中Servlet的过滤器Filter。