责任链模式分析

阿里 阅读:235 2021-06-22 16:23:33 评论:0

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

  抽象处理者(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); 
    } 
}

标签:设计模式
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号