责任链模式

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

  抽象处理者(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);
    }
}
原文地址:https://www.cnblogs.com/jiyukai/p/14786171.html