設計模式之責任鏈模式

定義

爲請求創建一個接收此次請求對象的鏈。

類型

行爲型

適用場景

①、一個請求的處理需要多個對象當中的一個或幾個協作處理。

優缺點

優點:
①、請求的發送者和接收者(請求的處理)解耦。
②、責任鏈可以動態組合。

缺點:
①、責任鏈太長或者處理時間過長,影響性能。
②、責任鏈有可能過多。

代碼實現

案例:前段時間,在阿里雲買個域名過期了,但是不想續費,想重新買一個新的。然後就重新買了一個。還以爲不用重新備案,沒想到,頂級域名是需要重新備案的。於是重新提交備案信息一步一步審批。首先是阿里雲審批,然後阿里雲審批通過就會提交給管局進行審批。
假設,阿里雲是對備案主體信息的審批,管局是對備案用戶信息的審批。

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。

參考鏈接
https://coding.imooc.com/learn/list/270.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章