责任链模式
Posted 被罚站的树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了责任链模式相关的知识,希望对你有一定的参考价值。
应用情景
责任链模式主要应用在对请求的处理上。当一个请求来临的时候,A、B、C都有可能去处理,由于A、B、C三者的能力不同,他们会更根据请求中携带的数据进行条件判断,如果满足自己的条件,才可以被自己处理,否则 需要由其他人处理。在这种情况下,我们可以使用if...else来处理请求,先进行条件判断,然后交给某人去处理。当然,更好的实现方式是使用责任链模式。将请求直接交给A,A自己进行条件判断,A如果发现自己处理不了,则将请求交给B,B再进行判断,以此类推。
类图关系
Handler:抽象类,定义处理方法handleMessage;定义编排方法setNext来设置下一个处理者;定义每个具体的处理者处理级别以及具体处理任务
concreteHandler:继承抽象类,实现自己的处理任务
示例代码
在责任链中前一个对象可以消费(增删改)一部分请求信息后交给下一个对象也是可以的。
public abstract class Handler{ private Handler nextHandler; public final Response handleMessage(Request request){ Response response = null; //判断是否是自己的处理级别 if(this.getHandleLevel().equals(request.getRequestLevel())){ response = this.echo(request); }else{ if(this.nextHandler != null) response = nextHandler.handleMessage(request); else{ //没有适当的处理者,业务自行处理 } } return response; } protected void setNext(Handler _handler){ this.nextHandler = _handler; } protected abstractLevell getHandleLevel(); protected abstract Response echo(Request request); }
具体处理者
class ConcreteHandler extends Handler{ protected Response echo(Request request){ //完成处理逻辑 return null; } //设置自己的处理级别 protected Level getHandlerLevel(){ return null; } }
模式有关框架的代码
class Level{ //定义一个请求处理等级 } class Request{ //请求处理等级 public Level getRequestLevel(){ return null; } } class Response{ //处理者返回的数据 }
场景类
class Client{ public static void main(String[] args) { //声明所有的处理节点 } Handler handler1 = new ConcreteHandler(); Handler handler2 = new ConcreteHandler(); Handler handler3 = new ConcreteHandler(); //设置链中的阶段程序1->2->3 handler1.setNext(handler2); handler2.setNext(handler3); //提交请求 Response response = handler1.handlerMessage(new Request()); }
总结
优点:将请求和处理分开,两者解耦,提高系统的灵活性
缺点:当链比较长,处理请求时性能就是一个问题,二是调试不是方便
以上是关于责任链模式的主要内容,如果未能解决你的问题,请参考以下文章