美文网首页
Java 责任链模式

Java 责任链模式

作者: 索性流年 | 来源:发表于2021-02-10 09:55 被阅读0次

    文集地址

    什么是责任链设计模式?

    • 客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象。这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链,使编程更有灵活性。

    • 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。其过程实际上是一个递归调用

    要点主要是:

    • 有多个对象共同对一个任务进行处理。

    • 这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。

    • 一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象,上结束任务的处理,并结束任务。

    • 客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。

    责任链模式应用场景

    • 多条件流程判断,权限控制。

    • ERP系统、流程审批

    • Java 过滤器底层实现 Filter

    责任链设计模式如何保证顺序问题?

    • 获取到责任链第一个,在第一个执行完成之后,在调用第二个进行执行,以此类推。

    应用案例

    • 小明因家里有事,需要请一个月的假,但他总不能直接就跑了吧,要是旷工一个月那他就彻底放假了,所以需要走公司流程跟领导请假,于是他就跟组长说,组长一看是一个月的假,他批不了,只能去找经理,而经理也没有这个权限,只能上报到董事长,由董事长亲自签字,最后这张请假条才能生效

    实现案例

    • 定义审批者抽象行为
    /**
     * 抽象类(定义共同行为)
     *
     * @author ext.liuyan10
     * @date 2021/2/7 9:48
     */
    public abstract class Handler {
        /**
         * 下一个责任链对象
         */
        protected Handler next;
    
        /**
         * 处理事件
         */
        public abstract void handleEvent();
    }
    
    
    • 组长审批
    /**
     * 责任链处理者(组长)
     *
     * @author ext.liuyan10
     * @date 2021/2/7 9:52
     */
    public class GroupLeaderHandler extends Handler {
    
        public GroupLeaderHandler() {
            ManagerHandler managerHandler = new ManagerHandler();
            this.next = managerHandler;
        }
    
        @Override
        public void handleEvent() {
            System.out.println("组长:一个月的假我批不了,我给你找经理去");
            this.next.handleEvent();
        }
    }
    
    
    • 经理审批
    /**
     * 责任链处理者(经理)
     *
     * @author ext.liuyan10
     * @date 2021/2/7 10:11
     */
    public class ManagerHandler extends Handler {
        public ManagerHandler() {
            ChairmanHandler chairmanHandler = new ChairmanHandler();
            this.next = chairmanHandler;
        }
    
        @Override
        public void handleEvent() {
            System.out.println("经理:这么长的假我也没权限审批,帮你交到董事长那,得他同意才行");
            this.next.handleEvent();
        }
    }
    
    
    • 董事长审批
    /**
     * 责任链处理者(董事长)
     *
     * @author ext.liuyan10
     * @date 2021/2/7 10:13
     */
    public class ChairmanHandler extends Handler {
        public ChairmanHandler() {
        }
    
        @Override
        public void handleEvent() {
            System.out.println("董事长审批完成");
        }
    }
    
    
    • 调用责任链
    /**
     * @author ext.liuyan10
     * @date 2021/2/7 9:47
     */
    public class ResponsilbillityApp {
        public static void main(String[] args) {
            GroupLeaderHandler groupLeaderHandler = new GroupLeaderHandler();
            groupLeaderHandler.handleEvent();
        }
    }
    
    
    • 执行结果
    Connected to the target VM, address: '127.0.0.1:56500', transport: 'socket'
    组长:一个月的假我批不了,我给你找经理去
    经理:这么长的假我也没权限审批,帮你交到董事长那,得他同意才行
    董事长审批完成
    Disconnected from the target VM, address: '127.0.0.1:56500', transport: 'socket'
    
    Process finished with exit code 0
    
    

    相关文章

      网友评论

          本文标题:Java 责任链模式

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