责任链设计模式

定义:多个对象都有机会处理请求,避免请求的处理者和请求的发送者耦合。当一个请求到来的时候,遍历责任链,找到第一个能够处理该请求的处理者。

优点:避免请求者和处理者耦合;方便的增加或减少处理者。

角色:请求者 抽象处理者 具体处理者

  抽象处理者定义了一个处理者需要具备的两个重要属性:1、什么条件下一个处理者能够处理请求 2、如果该处理者无法处理请求,应该把请求转发给哪一个处理者

package ChainOfResponsibility;

public abstract class Handler {
    private Handler nextHandler;
    private int maxDay;

    public void handlerRequest(int day){
        if (day<=maxDay){
            reply(day);
        }else {
            if (nextHandler!=null){
                nextHandler.handlerRequest(day);
            }else {
                System.out.println("没有更高的权限了");
            }
        }
    }

    public abstract void reply(int day);

    public Handler getNextHandler() {
        return nextHandler;
    }

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public int getMaxDay() {
        return maxDay;
    }

    public void setMaxDay(int maxDay) {
        this.maxDay = maxDay;
    }
}

  不同的具体处理者继承抽象处理者

package ChainOfResponsibility;

public class BigManager extends Handler
{
    @Override
    public void reply(int day) {
        System.out.println("我是总经理,我批了 "+day);
    }
}
package ChainOfResponsibility;

public class DepartManager extends Handler  {
    @Override
    public void reply(int day) {
        System.out.println("我的部门经理 我批了 "+day);
    }
}
package ChainOfResponsibility;

public class ProjectManager extends Handler {
    @Override
    public void reply(int day) {
        System.out.println("我是项目经理 我批了 "+day);
    }
}

  在测试方法中,需要把多个具体处理者连接成一个链,连接成链的关键是为每一个处理者添加后继

package ChainOfResponsibility;

public class test {
    public static void main(String[] args) {
        BigManager bigManager = new BigManager();
        bigManager.setMaxDay(10);
        DepartManager departManager = new DepartManager();
        departManager.setMaxDay(5);
        ProjectManager projectManager = new ProjectManager();
        projectManager.setMaxDay(3);

        projectManager.setNextHandler(departManager);
        departManager.setNextHandler(bigManager);
        bigManager.setNextHandler(null);

        projectManager.handlerRequest(2);
        projectManager.handlerRequest(4);
        projectManager.handlerRequest(9);
        projectManager.handlerRequest(90);
    }
}
原文地址:https://www.cnblogs.com/AshOfTime/p/10832880.html