设计模式之责任链模式

定义

为请求创建一个接收此次请求对象的链。

类型

行为型

适用场景

①、一个请求的处理需要多个对象当中的一个或几个协作处理。

优缺点

优点:
①、请求的发送者和接收者(请求的处理)解耦。
②、责任链可以动态组合。

缺点:
①、责任链太长或者处理时间过长,影响性能。
②、责任链有可能过多。

代码实现

案例:前段时间,在阿里云买个域名过期了,但是不想续费,想重新买一个新的。然后就重新买了一个。还以为不用重新备案,没想到,顶级域名是需要重新备案的。于是重新提交备案信息一步一步审批。首先是阿里云审批,然后阿里云审批通过就会提交给管局进行审批。
假设,阿里云是对备案主体信息的审批,管局是对备案用户信息的审批。

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

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