1.定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止。
2.使用场景
多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求。
3.简单实现
以一个费用报销为例。组长只能审批1000元以下费用,主管能审批5000元以下费用,经理能审批10000元以下费用,一万元以上需要老板审批。
//领导抽象 abstract class Leader{ //上一级领导处理 即 下一个处理节点 protected Leader nextHandler; //自身能审批额度 abstract int limit(); //处理报销行为 abstract void handle(int money); //处理报销请求 final void handleRequest(int money){ if (money <= limit()){ handle(money); }else { //交给下一节点 if (null != nextHandler){ nextHandler.handleRequest(money); } } } } //组长 class GroupLeader extends Leader{ @Override int limit() { //限额1000 return 1000; } @Override void handle(int money) { System.out.println("组长批复报销" + money + " 元"); } } //主管 class Director extends Leader{ @Override int limit() { //限额5000 return 5000; } @Override void handle(int money) { System.out.println("主管批复报销" + money + " 元"); } } //经理 class Manager extends Leader{ @Override int limit() { //限额10000 return 10000; } @Override void handle(int money) { System.out.println("经理批复报销" + money + " 元"); } } //Boss class Boss extends Leader{ @Override int limit() { //无限 return Integer.MAX_VALUE; } @Override void handle(int money) { System.out.println("老板牛逼!批复报销" + money + " 元"); } } public class RespChainMode { public static void main(String[] args){ //构造领导 GroupLeader groupLeader = new GroupLeader(); Director director = new Director(); Manager manager = new Manager(); Boss boss = new Boss(); //设置交给上级处理 groupLeader.nextHandler = director; director.nextHandler = manager; manager.nextHandler = boss; //请求报销 groupLeader.handleRequest(3489); groupLeader.handleRequest(20210); } }
输出:
4.小结
优点:
可以对请求者和处理者关系解耦,提高代码灵活性
缺点:
对请求处理者需要遍历,如果处理者太多影响性能,特别是在一些递归调用中。