定义:多个对象都有机会处理请求,避免请求的处理者和请求的发送者耦合。当一个请求到来的时候,遍历责任链,找到第一个能够处理该请求的处理者。
优点:避免请求者和处理者耦合;方便的增加或减少处理者。
角色:请求者 抽象处理者 具体处理者
抽象处理者定义了一个处理者需要具备的两个重要属性: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); } }