概述

责任链模式在面试中经常被问到,虽然知道哪些地方用到责任链模式(事件分发机制/OKHttp拦截器等),责任链模式的核心在于‘链’。将多个对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。有点像switch语句/if else语句,最终有个条件兜底处理该语句。

使用场景

  • 多个对象可以处理同一个请求,具体由哪个对象处理是在运行时决定的。

    UML

    责任链模式-基础 - 图1抽象处理者

    1. /**
    2. * 抽象处理者角色:声明一个请求处理的方法,
    3. * 并在其中保持一个对下一个处理节点Handler对象引用。
    4. **/
    5. public abstract class Handler {
    6. // 下一个节点处理者
    7. protected Handler successor;
    8. // 请求处理
    9. public abstract void handleRequest(String condition);
    10. }

    具体处理者1

    1. /**
    2. * 具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。
    3. */
    4. public class ConcreteHandler1 extends Handler {
    5. @Override
    6. public void handleRequest(String condition) {
    7. if (condition.equals("ConcreteHandler1")) {
    8. System.out.println("ConcreteHandler1 handled !!!! ");
    9. return;
    10. } else {
    11. successor.handleRequest(condition);// 处理下一个节点
    12. }
    13. }
    14. }

    具体处理者2

    1. /**
    2. * 具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。
    3. */
    4. public class ConcreteHandler2 extends Handler {
    5. @Override
    6. public void handleRequest(String condition) {
    7. if (condition.equals("ConcreteHandler2")) {
    8. System.out.println("ConcreteHandler2 handled !!!! ");
    9. return;
    10. } else {
    11. successor.handleRequest(condition);// 处理下一个节点
    12. }
    13. }
    14. }

    客户调用

    1. public class Client {
    2. public static void main(String[] args) {
    3. ConcreteHandler1 handler1 = new ConcreteHandler1();
    4. ConcreteHandler2 handler2 = new ConcreteHandler2();
    5. // 设置下一个节点
    6. handler1.successor = handler2;
    7. handler2.successor = handler1;
    8. handler1.handleRequest("ConcreteHandler1");
    9. }
    10. }

责任链模式-基础 - 图2抽象处理者

  1. public abstract class AbstractHandler {
  2. protected AbstractHandler nextHandler;// 下一节点处理对象
  3. // 请求对象
  4. public final void handleRequest(AbstractRequest request) {
  5. if (getHandlerLevel() == request.getRequestLevel()) {
  6. handle(request);
  7. } else {
  8. if (nextHandler != null) {
  9. nextHandler.handleRequest(request);
  10. } else {
  11. System.out.println("");
  12. }
  13. }
  14. }
  15. // 获取处理者对象的处理级别
  16. protected abstract int getHandlerLevel();
  17. // 每个处理者对象的具体处理方式
  18. protected abstract void handle(AbstractRequest request);
  19. }

抽象请求者

  1. public abstract class AbstractRequest {
  2. protected Object obj;// 处理对象
  3. public AbstractRequest(Object obj) {
  4. this.obj = obj;
  5. }
  6. // 获取处理的内容对象
  7. public Object getContent() {
  8. return obj;
  9. }
  10. // 获取请求级别
  11. public abstract int getRequestLevel();
  12. }

处理者

  1. public class Handler1 extends AbstractHandler {
  2. @Override
  3. protected int getHandlerLevel() {
  4. return 1;
  5. }
  6. @Override
  7. protected void handle(AbstractRequest request) {
  8. System.out.println("Handler1 handle request: " + request.getRequestLevel());
  9. }
  10. }
  11. public class Handler2 extends AbstractHandler {
  12. @Override
  13. protected int getHandlerLevel() {
  14. return 2;
  15. }
  16. @Override
  17. protected void handle(AbstractRequest request) {
  18. System.out.println("Handler2 handle request: " + request.getRequestLevel());
  19. }
  20. }
  21. public class Handler3 extends AbstractHandler {
  22. @Override
  23. protected int getHandlerLevel() {
  24. return 2;
  25. }
  26. @Override
  27. protected void handle(AbstractRequest request) {
  28. System.out.println("Handler3 handle request: " + request.getRequestLevel());
  29. }
  30. }

请求者

  1. public class Request1 extends AbstractRequest{
  2. public Request1(Object obj) {
  3. super(obj);
  4. }
  5. @Override
  6. public int getRequestLevel() {
  7. return 1;
  8. }
  9. }
  10. public class Request2 extends AbstractRequest{
  11. public Request2(Object obj) {
  12. super(obj);
  13. }
  14. @Override
  15. public int getRequestLevel() {
  16. return 2;
  17. }
  18. }
  19. public class Request3 extends AbstractRequest{
  20. public Request3(Object obj) {
  21. super(obj);
  22. }
  23. @Override
  24. public int getRequestLevel() {
  25. return 3;
  26. }
  27. }

客户调用

  1. public class Client {
  2. public static void main(String[] args) {
  3. // 构造3个处理者对象
  4. AbstractHandler handler1 = new Handler1();
  5. AbstractHandler handler2 = new Handler2();
  6. AbstractHandler handler3 = new Handler3();
  7. // 设置当前处理者对象下一个节点的处理者对象
  8. handler1.nextHandler = handler2;
  9. handler2.nextHandler = handler3;
  10. // 构造3个请求对象
  11. AbstractRequest request1 = new Request1("Request1");
  12. AbstractRequest request2 = new Request2("Request2");
  13. AbstractRequest request3 = new Request3("Request3");
  14. // 从链式首端发起请求
  15. handler1.handle(request1);
  16. handler1.handle(request2);
  17. handler1.handle(request3);
  18. }
  19. }

Coding

  1. public abstract class Leader {
  2. protected Leader nextHandler;
  3. public final void handleRequest(int money) {
  4. if (money <= limit()) {
  5. handle(money);
  6. } else {
  7. if (null != nextHandler) {
  8. nextHandler.handleRequest(money);
  9. }
  10. }
  11. }
  12. public abstract int limit();
  13. public abstract void handle(int money);
  14. }
  15. public class Grouper extends Leader {
  16. @Override
  17. public int limit() {
  18. return 1000;
  19. }
  20. @Override
  21. public void handle(int money) {
  22. System.out.println("组长批复报销: " + money + "元");
  23. }
  24. }
  25. public class Director extends Leader {
  26. @Override
  27. public int limit() {
  28. return 5000;
  29. }
  30. @Override
  31. public void handle(int money) {
  32. System.out.println("主管批复报销:" + money + "元");
  33. }
  34. }
  35. public class Manager extends Leader {
  36. @Override
  37. public int limit() {
  38. return 10000;
  39. }
  40. @Override
  41. public void handle(int money) {
  42. System.out.println("经理批复报销:" + money + "元");
  43. }
  44. }
  45. public class Boss extends Leader {
  46. @Override
  47. public int limit() {
  48. return Integer.MAX_VALUE;
  49. }
  50. @Override
  51. public void handle(int money) {
  52. System.out.println("老板批复报销:" + money + "元");
  53. }
  54. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. Grouper grouper = new Grouper();
  4. Director director = new Director();
  5. Manager manager = new Manager();
  6. Boss boss = new Boss();
  7. grouper.nextHandler = director;
  8. director.nextHandler = manager;
  9. manager.nextHandler = boss;
  10. grouper.handleRequest(5000);
  11. }
  12. }