职责链模式的原理和实现

将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

职责链模式有多种实现方式:

  • 第一种实现方式类似链表, 每个 Handler 存储下一个要执行的 Handler
  1. public abstract class Handler {
  2. protected Handler successor = null;
  3. public void setSuccessor(Handler successor) {
  4. this.successor = successor;
  5. }
  6. public final void handle() {
  7. boolean handled = doHandle();
  8. if (successor != null && !handled) {
  9. successor.handle();
  10. }
  11. }
  12. protected abstract boolean doHandle();
  13. }
  14. public class HandlerA extends Handler {
  15. @Override
  16. protected boolean doHandle() {
  17. boolean handled = false;
  18. //...
  19. return handled;
  20. }
  21. }
  22. public class HandlerB extends Handler {
  23. @Override
  24. protected boolean doHandle() {
  25. boolean handled = false;
  26. //...
  27. return handled;
  28. }
  29. }
  30. // HandlerChain和Application代码不变
  • 第二种实现方式使用数组
  1. public interface IHandler {
  2. boolean handle();
  3. }
  4. public class HandlerA implements IHandler {
  5. @Override
  6. public boolean handle() {
  7. boolean handled = false;
  8. //...
  9. return handled;
  10. }
  11. }
  12. public class HandlerB implements IHandler {
  13. @Override
  14. public boolean handle() {
  15. boolean handled = false;
  16. //...
  17. return handled;
  18. }
  19. }
  20. public class HandlerChain {
  21. private List<IHandler> handlers = new ArrayList<>();
  22. public void addHandler(IHandler handler) {
  23. this.handlers.add(handler);
  24. }
  25. public void handle() {
  26. for (IHandler handler : handlers) {
  27. boolean handled = handler.handle();
  28. if (handled) {
  29. break;
  30. }
  31. }
  32. }
  33. }
  34. // 使用举例
  35. public class Application {
  36. public static void main(String[] args) {
  37. HandlerChain chain = new HandlerChain();
  38. chain.addHandler(new HandlerA());
  39. chain.addHandler(new HandlerB());
  40. chain.handle();
  41. }
  42. }

GoF 给出的定义中,如果处理器链上的某个处理器能够处理这个请求,那就不会继续往下传递请求。实际上,职责链模式还有一种变体,那就是请求会被所有的处理器都处理一遍,不存在中途终止的情况。

职责链模式的应用场景举例

首先,我们来看,职责链模式如何应对代码的复杂性。

其次,我们再来看,职责链模式如何让代码满足开闭原则,提高代码的扩展性。