责任链模式(Chain of Responsibility Pattern)将链中每一个节点都看作一个对象,每个节点处理的请求均不同,且内部自动维护下一个节点对象。当一个请求从链式的首端发出时,会沿着责任链预设的路径依次传递到每一个节点对象,直至被链中的某个对象处理为止,属于行为型设计模式。
    image.png
    解耦请求与处理,客户端只需要把请求发送到责任链上,请求回自动进行传递,直至有节点对象进行处理。

    1. public abstract class Handler {
    2. protected Handler nextHandler;
    3. public Handler getNextHandler() {
    4. return nextHandler;
    5. }
    6. public void setNextHandler(Handler nextHandler) {
    7. this.nextHandler = nextHandler;
    8. }
    9. public abstract void handle(String request);
    10. }
    11. public class ConcreteHandlerA extends Handler {
    12. @Override
    13. public void handle(String request) {
    14. if("A".equals(request)){
    15. System.out.println("A handler");
    16. return;
    17. }
    18. if(this.nextHandler!= null){
    19. this.nextHandler.handle(request);
    20. }
    21. }
    22. }
    23. public class ConcreteHandlerB extends Handler {
    24. @Override
    25. public void handle(String request) {
    26. if("B".equals(request)){
    27. System.out.println("B handler");
    28. return;
    29. }
    30. if(this.nextHandler!= null){
    31. this.nextHandler.handle(request);
    32. }
    33. }
    34. }
    35. public class Clinet {
    36. public static void main(String[] args){
    37. Handler handlerA = new ConcreteHandlerA();
    38. Handler handlerB = new ConcreteHandlerB();
    39. handlerA.setNextHandler(handlerB);
    40. handlerA.handle("B");
    41. }
    42. }

    不一定要有一个Handler处理完就只直接返回,也可以每个Handler只处理自己相关的部分,一个Handler处理一部分后交给下一个Hnadler接着处理

    责任链模式与构造者模式混用

    1. public abstract class Handler {
    2. protected Handler nextHandler;
    3. private void setNextHandler(Handler nextHandler) {
    4. this.nextHandler = nextHandler;
    5. }
    6. public abstract void handle(String request);
    7. static class Builder{
    8. private Handler head;
    9. private Handler tail;
    10. public Builder addHandler(Handler handler){
    11. if(this.head == null){
    12. this.head = this.tail = handler;
    13. return this;
    14. }
    15. this.tail.setNextHandler(handler);
    16. this.tail = handler;
    17. return this;
    18. }
    19. public Handler build(){
    20. return this.head;
    21. }
    22. }
    23. }
    24. public static void main(String[] args){
    25. Handler.Builder builder = new Handler.Builder();
    26. builder.addHandler(new ConcreteHandlerA());
    27. builder.addHandler(new ConcreteHandlerB());
    28. Handler handler = builder.build();
    29. handler.handle("B");
    30. }

    框架

    • Filter
    • Netty的Pipeline

    优点

    • 请求和处理解耦
    • 易于扩展新的处理节点,符合开闭原则
    • 每个处理节点只关注自己的业务/请求
    • 可以动态新增删除责任
    • 处理节点容易复用

    缺点

    • 责任链太长,影响性能
    • 循环引用会造成死循环