• 责任链模式


      责任链模式主要包含以下角色。

      抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

      具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

      客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

      Handler的实现可以有多个,比如请假场景

      Handler的实现直线领导可以批一天假

      Handler的实现项目经理可以批三天假

      Handler的实现Boss可以批七天假

      然后把这三个角色串成一个链表结构,用户只需往第一个节点发送请求,由节点做条件判断和传递到下一个结点,最终得到请假结果,用户无需关心事情最后被谁处理了

      再有更高级别人审批假期的话,只需要增加一个角色,添加到责任链即可,原先的代码不动,符合开闭原则

      抽象处理者(Handler):以链表的数据结构形式存在,抽象出处理请求的方法,可以有多个实现

    public abstract class Handler {
    
        public Handler handler;
    
        public Handler getNext() {
            return handler;
        }
    
        public void setNext(Handler handler) {
            this.handler = handler;
        }
    
        /**
         * 处理请求的方法
         */
        public abstract void resRequest(int days);
    }

      具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断请求的处理条件和下一个Handler节点的路由

    /**
     * 直线领导批复一天请假的处理
     * @author test11
     */
    public class Leader extends Handler{
    
        @Override
        public void resRequest(int days) {
            if(days<=1){
                System.out.println("直线主管审批了你的请求");
            }else{
                if(null != getNext()){
                    getNext().resRequest(days);
                }else{
                    System.out.println("请求天数不合法");
                }
            }
        }
    
    }
    /**
     * 项目经理批三天假的处理
     * @author test11
     */
    public class PM extends Handler{
    
        @Override
        public void resRequest(int days) {
            if(days>1 && days<=3){
                System.out.println("项目经理审批了你的请求");
            }else{
                if(null != getNext()){
                    getNext().resRequest(days);
                }else{
                    System.out.println("请求天数不合法");
                }
            }
        }
    
    }
    /**
     * Boss审批7天休假的处理
     * @author test11
     */
    public class Boss extends Handler{
    
        @Override
        public void resRequest(int days) {
            if(days>3){
                System.out.println("Boss审批了你的请求");
            }else{
                if(null != getNext()){
                    getNext().resRequest(days);
                }else{
                    System.out.println("请求天数不合法");
                }
            }
        }
    
    }

      客户类(Client)角色:创建客户类,串起处理链并发送请求

    /**
     * 测试责任链模式
     * @author test11
     */
    public class Demo {
    
        public static void main(String[] args) {
            //构建责任链
            Handler leader = new Leader();
            Handler pm = new PM();
            Handler boss = new Boss();
            leader.setNext(pm);
            pm.setNext(boss);
    
            //发出处理请求,无需关心最终是谁审批
            leader.resRequest(8);
        }
    }
  • 相关阅读:
    [USACO07DEC]观光奶牛Sightseeing Cows
    洛谷 U3348 A2-回文数
    LOJ #2037. 「SHOI2015」脑洞治疗仪
    1441 士兵的数字游戏
    BZOJ 1108: [POI2007]天然气管道Gaz
    P3047 [USACO12FEB]附近的牛Nearby Cows
    POJ 3061 Subsequence
    Hdu 5776 sum
    1052 最大M子段和
    1288 埃及分数
  • 原文地址:https://www.cnblogs.com/jiyukai/p/14786171.html
Copyright © 2020-2023  润新知