美文网首页
责任链模式

责任链模式

作者: 攻城虱小马褂 | 来源:发表于2021-09-29 21:53 被阅读0次

    一个故事

    小张需要申请一台显示器,需要在公司内部系统提交审核清单。审核清单的审批流程要经过直属领导、部门领导、资源部领导几个环节审批,其中任何一个环节审核不通过,显示器就申请不下来。

    责任链模式来模拟审批流程

    审批流程就像一个链条一样,一级一级审批,直到最后资源部领导核查通过,小张就能拿到想要的显示器了

    代码案例

    public abstract class VerifyHandler {
        private VerifyHandler nextVerify;
    
        public void setNextVerify(VerifyHandler nextVerify){
            this.nextVerify = nextVerify;
        }
    
        public abstract void examine(Request request);
    
        public void nextVerify(Request request){
            if(nextVerify != null){
                this.nextVerify.examine(request);
            }
        }
    }
    
    public class TeamLeaderVerifyHandler extends VerifyHandler{
    
        @Override
        public void examine(Request request) {
            System.out.println(request.getRequest());
    
            System.out.println("直属领导审批通过");
    
            nextVerify(request);
        }
    }
    
    public class ApartmentVerifyHandler extends VerifyHandler{
        @Override
        public void examine(Request request) {
            System.out.println("部门领导审批通过");
    
            nextVerify(request);
        }
    }
    
    public class ResourceVerifyHandler extends VerifyHandler{
        @Override
        public void examine(Request request) {
            System.out.println("资源部领导审批通过");
            System.out.println("发放显示器");
        }
    }
    
    public class Request {
        private String request;
    
        public String getRequest() {
            return request;
        }
    
        public void setRequest(String request) {
            this.request = request;
        }
    
        public Request(String request){
            this.request = request;
        }
    }
    
    public class Client {
        public static void main(String[] args) {
            TeamLeaderVerifyHandler teamLeaderVerifyHandler = new TeamLeaderVerifyHandler();
            ApartmentVerifyHandler apartmentVerifyHandler = new ApartmentVerifyHandler();
            ResourceVerifyHandler resourceVerifyHandler = new ResourceVerifyHandler();
    
            teamLeaderVerifyHandler.setNextVerify(apartmentVerifyHandler);
            apartmentVerifyHandler.setNextVerify(resourceVerifyHandler);
    
            Request request = new Request("申请一条显示器");
            teamLeaderVerifyHandler.examine(request);
        }
    }
    

    如何理解责任链模式

    使多个对象都有机会处理请求,从未避免了发送者与接收者之间的耦合关系,将这些对象连成一个链条,沿着链条传递请求。其结构和链表是类似的。

    当有审批流程进入时,先经过直属领导审批,待直属领导审批通过后,再把审批请求传递给部门领导,部门领导审批过后再传递给资源部领导,由此类推,形成一个链条,链条上的每个对象的职责各不相同。

    责任链模式模型抽象

    类图(TODO)

    责任链模式的应用

    • 过滤器
    • 拦截器

    责任链模式的优点

    • 请求者与接收者之间解耦
    • 符合开闭原则,易于扩展

    责任链模式的缺点

    • 性能问题。链表较长的时候会有性能问题(应该设置节点阈值)
    • 调试逻辑比较复杂(调用者不知道被哪些接受者调用)

    相关文章

      网友评论

          本文标题:责任链模式

          本文链接:https://www.haomeiwen.com/subject/fymqnltx.html