责任链模式(Chain of Responsibility Pattern)将链中每一个节点都看作一个对象,每个节点处理的请求均不同,且内部自动维护下一个节点对象。当一个请求从链式的首端发出时,会沿着责任链预设的路径依次传递到每一个节点对象,直至被链中的某个对象处理为止,属于行为型设计模式。
解耦请求与处理,客户端只需要把请求发送到责任链上,请求回自动进行传递,直至有节点对象进行处理。
public abstract class Handler {protected Handler nextHandler;public Handler getNextHandler() {return nextHandler;}public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public abstract void handle(String request);}public class ConcreteHandlerA extends Handler {@Overridepublic void handle(String request) {if("A".equals(request)){System.out.println("A handler");return;}if(this.nextHandler!= null){this.nextHandler.handle(request);}}}public class ConcreteHandlerB extends Handler {@Overridepublic void handle(String request) {if("B".equals(request)){System.out.println("B handler");return;}if(this.nextHandler!= null){this.nextHandler.handle(request);}}}public class Clinet {public static void main(String[] args){Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();handlerA.setNextHandler(handlerB);handlerA.handle("B");}}
不一定要有一个Handler处理完就只直接返回,也可以每个Handler只处理自己相关的部分,一个Handler处理一部分后交给下一个Hnadler接着处理
责任链模式与构造者模式混用
public abstract class Handler {protected Handler nextHandler;private void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public abstract void handle(String request);static class Builder{private Handler head;private Handler tail;public Builder addHandler(Handler handler){if(this.head == null){this.head = this.tail = handler;return this;}this.tail.setNextHandler(handler);this.tail = handler;return this;}public Handler build(){return this.head;}}}public static void main(String[] args){Handler.Builder builder = new Handler.Builder();builder.addHandler(new ConcreteHandlerA());builder.addHandler(new ConcreteHandlerB());Handler handler = builder.build();handler.handle("B");}
框架
- Filter
- Netty的Pipeline
优点
- 请求和处理解耦
- 易于扩展新的处理节点,符合开闭原则
- 每个处理节点只关注自己的业务/请求
- 可以动态新增删除责任
- 处理节点容易复用
缺点
- 责任链太长,影响性能
- 循环引用会造成死循环
