责任链模式(Chain of Responsibility Pattern)就是在一个请求出去后,将请求的接受对象串为一个链路。请求对象只负责将请求发送出去,不管这个链路中哪个对象接受处理,将请求的发送者和接收者进行解耦。属于行为型模式。
在Java中,Servlet的Filter拦截器、Struts2 的拦截器等都是使用了责任链模式。还有全局异常处理,我们捕捉到异常后,一路往下抛,有可能是运行时异常、有可能是自定义异常,会被响应的判断所截获处理。
代码实现:
一、一个异常对象被一条责任链中的三个对象处理
1.新建一个每个处理器都要继承的异常处理接口packagecom.xing.design.chainOfResponsibility; publicinterfaceExcetionHandle { /*** 处理异常 * @param type 异常类型*/voidhandle(Stringtype); /*** 设置下一个处理器* @param excetionHandle*/voidsetNextExcetionHandle(ExcetionHandleexcetionHandle); } 2.建三个处理器类packagecom.xing.design.chainOfResponsibility; publicclassRunTimeExcetionHandleimplementsExcetionHandle{ privateExcetionHandleexcetionHandle; publicvoidhandle(Stringtype) { if("运行时异常".equals(type)) { System.out.println("异常已被RunTimeExcetionHandle处理->"+type); }else { // 处理不了,下一个System.out.println("RunTimeExcetionHandle处理不了->"+type+",下一个"); excetionHandle.handle(type); } } publicvoidsetNextExcetionHandle(ExcetionHandleexcetionHandle) { this.excetionHandle=excetionHandle; } } packagecom.xing.design.chainOfResponsibility; publicclassClassNotFoundExcetionHandleimplementsExcetionHandle{ privateExcetionHandleexcetionHandle; publicvoidhandle(Stringtype) { if("未找到类异常".equals(type)) { System.out.println("异常已被ClassNotFoundExcetionHandle处理->"+type); }else { // 处理不了,下一个System.out.println("ClassNotFoundExcetionHandle处理不了->"+type+",下一个"); excetionHandle.handle(type); } } publicvoidsetNextExcetionHandle(ExcetionHandleexcetionHandle) { this.excetionHandle=excetionHandle; } } packagecom.xing.design.chainOfResponsibility; publicclassAllExcetionHandleimplementsExcetionHandle{ publicvoidhandle(Stringtype) { System.out.println("异常已被AllExcetionHandle处理->"+type); } publicvoidsetNextExcetionHandle(ExcetionHandleexcetionHandle) { System.out.println("没有其他异常了,AllExcetionHandle就全捕捉掉"+excetionHandle); } } 3.编写main方法测试,将上述处理器串成一条责任链packagecom.xing.design.chainOfResponsibility; publicclassChainOfResponsibilityDemo { publicstaticvoidmain(String[] args) { StringrunTime="运行时异常"; StringclassNotFound="未找到类异常"; StringsysTem="系统异常"; Stringamazing="未知异常"; ExcetionHandlerunTimeExcetionHandle=newRunTimeExcetionHandle(); ExcetionHandleclassNotFoundExcetionHandle=newClassNotFoundExcetionHandle(); ExcetionHandleallExcetionHandle=newAllExcetionHandle(); // 组装责任链,运行时 -> 类未找到 -> 全部异常runTimeExcetionHandle.setNextExcetionHandle(classNotFoundExcetionHandle); classNotFoundExcetionHandle.setNextExcetionHandle(allExcetionHandle); // 从第一个处理类开始倒着处理上述异常:System.out.println("---------------------------开始处理【"+amazing+"】---------------------------"); runTimeExcetionHandle.handle(amazing); System.out.println("---------------------------【"+amazing+"】处理完毕---------------------------"); System.out.println("---------------------------开始处理【"+sysTem+"】---------------------------"); runTimeExcetionHandle.handle(sysTem); System.out.println("---------------------------【"+sysTem+"】处理完毕---------------------------"); System.out.println("---------------------------开始处理【"+classNotFound+"】---------------------------"); runTimeExcetionHandle.handle(classNotFound); System.out.println("---------------------------【"+classNotFound+"】处理完毕---------------------------"); System.out.println("---------------------------开始处理【"+runTime+"】---------------------------"); runTimeExcetionHandle.handle(runTime); System.out.println("---------------------------【"+runTime+"】处理完毕---------------------------"); } }
4.测试结果
每个接收者都包含对下一个接收者的引用。如果前一个接收者不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
这么一说,好像if else也算责任链哈!
总结:
责任链模式将接收者组成一串责任链,发送者不需要知道责任链中哪一个接收者处理的,实现了发送者和接收者的解耦。
END