十三 每天学习一个设计模式:行为型之责任链模式( 五 )


责任链模式的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果,其通用类图如图所示 。
责任链模式的核心在“链”上,“链”是由多个处理者组成的,我们先来看抽象类 。
public abstract class Handler {private Handler nextHandler;public final Response handleMessage(Request request) {Response response = null;//判断是否是自己的处理级别if (this.getHandlerLevel().equals(request.getRequestLevel())) {response = this.echo(request);} else {//不属于自己的处理级别,判断是否有下一个处理者if (this.nextHandler != null) {response = this.nextHandler.handleMessage(request);} else {//没有适当的处理者,业务自行处理}}return response;}/*** 设置下一个处理者是谁** @param handler*/public void setNext(Handler handler) {this.nextHandler = handler;}/*** 每个处理者都有一个处理级别** @return*/protected abstract Level getHandlerLevel();/*** 每个处理者都必须实现处理任务** @param request* @return*/protected abstract Response echo(Request request);}
抽象的处理者实现三个职责:一是定义一个请求的处理方法,唯一对外开放的方法;二是定义一个链的编排方法,设置下一个处理者;三是定义了具体的请求者必须实现的两个方法:定义自己能够处理的级别和具体的处理任务echo 。
注意 在责任链模式中一个请求发送到链中后,前一节点消费部分消息,然后交由后续节点继续处理,最终可以有处理结果也可以没有处理结果,读者可以不用理会什么纯的、不纯的责任链模式 。同时,请读者注意方法前的final关键字 。
我们定义三个具体的处理者,以便可以组成一个链 。
public class ConcreteHandler1 extends Handler {@Overrideprotected Level getHandlerLevel() {//完成处理逻辑return null;}@Overrideprotected Response echo(Request request) {//设置自己的处理级别return null;}}public class ConcreteHandler2 extends Handler {@Overrideprotected Level getHandlerLevel() {//完成处理逻辑return null;}@Overrideprotected Response echo(Request request) {//设置自己的处理级别return null;}}public class ConcreteHandler3 extends Handler {@Overrideprotected Level getHandlerLevel() {//完成处理逻辑return null;}@Overrideprotected Response echo(Request request) {//设置自己的处理级别return null;}}
在处理者中涉及三个类:Level类负责定义请求和处理级别,类负责封装请求,负责封装链中返回的结果,该三个类都需要根据业务产生,读者可以在实际应用中完成相关的业务填充 。
public class Level {//定义一个请求和处理等级}public class Request {/*** 请求的等级* @return*/public Level getRequestLevel(){return null;}}public class Response {//处理返回的数据}
在场景类或高层模块中对链进行组装,并传递请求,返回结果 。
public class Client {public static void main(String[] args) {//声明所有的处理节点Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();Handler handler3 = new ConcreteHandler3();//设置链中的极端顺序1-->2-->3handler1.setNext(handler2);handler2.setNext(handler3);//提交请求,返回结果Response response = handler1.handleMessage(new Request());}}
在实际应用中,一般会有一个封装类对责任模式进行封装,也就是替代类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了高层次模块的调用,减少模块间的耦合,提高系统的灵活性 。
3.责任链模式的优缺点 责任链模式的优点