概述
责任链模式在面试中经常被问到,虽然知道哪些地方用到责任链模式(事件分发机制/OKHttp拦截器等),责任链模式的核心在于‘链’。将多个对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。有点像switch语句/if else语句,最终有个条件兜底处理该语句。
使用场景
多个对象可以处理同一个请求,具体由哪个对象处理是在运行时决定的。
UML
抽象处理者
/*** 抽象处理者角色:声明一个请求处理的方法,* 并在其中保持一个对下一个处理节点Handler对象引用。**/public abstract class Handler {// 下一个节点处理者protected Handler successor;// 请求处理public abstract void handleRequest(String condition);}
具体处理者1
/*** 具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。*/public class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(String condition) {if (condition.equals("ConcreteHandler1")) {System.out.println("ConcreteHandler1 handled !!!! ");return;} else {successor.handleRequest(condition);// 处理下一个节点}}}
具体处理者2
/*** 具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。*/public class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(String condition) {if (condition.equals("ConcreteHandler2")) {System.out.println("ConcreteHandler2 handled !!!! ");return;} else {successor.handleRequest(condition);// 处理下一个节点}}}
客户调用
public class Client {public static void main(String[] args) {ConcreteHandler1 handler1 = new ConcreteHandler1();ConcreteHandler2 handler2 = new ConcreteHandler2();// 设置下一个节点handler1.successor = handler2;handler2.successor = handler1;handler1.handleRequest("ConcreteHandler1");}}
抽象处理者
public abstract class AbstractHandler {protected AbstractHandler nextHandler;// 下一节点处理对象// 请求对象public final void handleRequest(AbstractRequest request) {if (getHandlerLevel() == request.getRequestLevel()) {handle(request);} else {if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("");}}}// 获取处理者对象的处理级别protected abstract int getHandlerLevel();// 每个处理者对象的具体处理方式protected abstract void handle(AbstractRequest request);}
抽象请求者
public abstract class AbstractRequest {protected Object obj;// 处理对象public AbstractRequest(Object obj) {this.obj = obj;}// 获取处理的内容对象public Object getContent() {return obj;}// 获取请求级别public abstract int getRequestLevel();}
处理者
public class Handler1 extends AbstractHandler {@Overrideprotected int getHandlerLevel() {return 1;}@Overrideprotected void handle(AbstractRequest request) {System.out.println("Handler1 handle request: " + request.getRequestLevel());}}public class Handler2 extends AbstractHandler {@Overrideprotected int getHandlerLevel() {return 2;}@Overrideprotected void handle(AbstractRequest request) {System.out.println("Handler2 handle request: " + request.getRequestLevel());}}public class Handler3 extends AbstractHandler {@Overrideprotected int getHandlerLevel() {return 2;}@Overrideprotected void handle(AbstractRequest request) {System.out.println("Handler3 handle request: " + request.getRequestLevel());}}
请求者
public class Request1 extends AbstractRequest{public Request1(Object obj) {super(obj);}@Overridepublic int getRequestLevel() {return 1;}}public class Request2 extends AbstractRequest{public Request2(Object obj) {super(obj);}@Overridepublic int getRequestLevel() {return 2;}}public class Request3 extends AbstractRequest{public Request3(Object obj) {super(obj);}@Overridepublic int getRequestLevel() {return 3;}}
客户调用
public class Client {public static void main(String[] args) {// 构造3个处理者对象AbstractHandler handler1 = new Handler1();AbstractHandler handler2 = new Handler2();AbstractHandler handler3 = new Handler3();// 设置当前处理者对象下一个节点的处理者对象handler1.nextHandler = handler2;handler2.nextHandler = handler3;// 构造3个请求对象AbstractRequest request1 = new Request1("Request1");AbstractRequest request2 = new Request2("Request2");AbstractRequest request3 = new Request3("Request3");// 从链式首端发起请求handler1.handle(request1);handler1.handle(request2);handler1.handle(request3);}}
Coding
public abstract class Leader {protected Leader nextHandler;public final void handleRequest(int money) {if (money <= limit()) {handle(money);} else {if (null != nextHandler) {nextHandler.handleRequest(money);}}}public abstract int limit();public abstract void handle(int money);}public class Grouper extends Leader {@Overridepublic int limit() {return 1000;}@Overridepublic void handle(int money) {System.out.println("组长批复报销: " + money + "元");}}public class Director extends Leader {@Overridepublic int limit() {return 5000;}@Overridepublic void handle(int money) {System.out.println("主管批复报销:" + money + "元");}}public class Manager extends Leader {@Overridepublic int limit() {return 10000;}@Overridepublic void handle(int money) {System.out.println("经理批复报销:" + money + "元");}}public class Boss extends Leader {@Overridepublic int limit() {return Integer.MAX_VALUE;}@Overridepublic void handle(int money) {System.out.println("老板批复报销:" + money + "元");}}
public class Client {public static void main(String[] args) {Grouper grouper = new Grouper();Director director = new Director();Manager manager = new Manager();Boss boss = new Boss();grouper.nextHandler = director;director.nextHandler = manager;manager.nextHandler = boss;grouper.handleRequest(5000);}}
