定義
爲請求創建一個接收此次請求對象的鏈。
類型
行爲型
適用場景
①、一個請求的處理需要多個對象當中的一個或幾個協作處理。
優缺點
優點:
①、請求的發送者和接收者(請求的處理)解耦。
②、責任鏈可以動態組合。
缺點:
①、責任鏈太長或者處理時間過長,影響性能。
②、責任鏈有可能過多。
代碼實現
案例:前段時間,在阿里雲買個域名過期了,但是不想續費,想重新買一個新的。然後就重新買了一個。還以爲不用重新備案,沒想到,頂級域名是需要重新備案的。於是重新提交備案信息一步一步審批。首先是阿里雲審批,然後阿里雲審批通過就會提交給管局進行審批。
假設,阿里雲是對備案主體信息的審批,管局是對備案用戶信息的審批。
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。