在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
责任链模式涉及到的角色如下所示:
Ø 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。下图中的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
Ø 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
代码如下:
Handler抽象类:
public abstract class Handler { protected Handler sucessor; public abstract void handleRequest(Request req); getter...setter }
Handler具体实现子类:
public class ConcreteHandler1 extends Handler { @Override public void handleRequest(Request condition) { // 如果是自己的责任,就自己处理,负责传给下家处理 if(condition.getReqStr().equals("ConcreteHandler1")){ System.out.println( "ConcreteHandler1 handled "); return ; }else{ System.out.println( "ConcreteHandler1 passed "); this.getSucessor().handleRequest(condition); } } }
另一个实现类:
public class ConcreteHandler2 extends Handler { @Override public void handleRequest(Request condition) { // 如果是自己的责任,就自己处理,负责传给下家处理 if(condition.getReqStr().equals("ConcreteHandler2")){ System.out.println( "ConcreteHandler2 handled "); return ; }else{ System.out.println( "ConcreteHandler2 passed "); getSucessor().handleRequest(condition); } } }
客户端调用:
Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); //链起来 handler1.setSucessor(handler2); //假设这个请求是ConcreteHandler2的责任 Request request = new Request(); request.setReqStr("ConcreteHandler2"); handler1.handleRequest(request);
运行结果如下:
ConcreteHandler1 passed
ConcreteHandler2 handled
上面简单的例子是根据请求信息来进行过滤,当是自己需要处理的请求时过滤器处理并返回。另外一种是过滤器先处理,再判断是否还有下一个过滤器,有则再交给下一个过滤器。
public void handleRequest(Request condition) { System.out.println("过滤器先处理"); if (this.getSucessor() != null) { this.getSucessor().handleRequest(condition); } System.out.println("过滤器处理完毕"); }
纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,二是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大的意义了。
相关推荐
设计模式C++学习之责任链模式(Chain of Responsibility)
NULL 博文链接:https://stelin.iteye.com/blog/932101
【Java设计模式】(3)责任链Chain of Responsibility源码
23种设计模式之二十一(行为模式)Chain of Responsibility模式
责任链模式(Chain of Responsibility Pattern)是一种常见的行为模式。 使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有...
C#面向对象设计模式 Chain of Responsibility 职责链模式 视频讲座下载
C#面向对象设计模式 (行为型模式) Chain Of Responsibility 职责链模式 视频讲座下载
Chain Of Responsibility.rar
chain of responsibility 职责链模式(行为模式)来自于Microsoft官方网站视频教程,详细介绍了职责链模式的运用,且在本人提供的资源里可以下载到相关的PDF辅助文档帮助
C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式
主要介绍了Java设计模式之责任链模式(Chain of Responsibility模式)介绍,本文讲解了如何使用责任链模式,并给出了4种使用实例,需要的朋友可以参考下
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) (Level 300)
NULL 博文链接:https://linkcqu.iteye.com/blog/355806
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式)
chain-of-responsibility-demo 责任链模式demo
V神关于跨链的论文,英文原版+中文翻译版
设计模式-责任链的演示项目,导入eclipse中可直接运行,编程语言:java 设计模式学习请参考博客 https://www.li-tian.net.cn/archives/2020-01-27-23-01-15
NULL 博文链接:https://gary0416.iteye.com/blog/913457
主要面向所有区块链领域的技术人员。特别是想分析区块链应用的人员。可以看看已经实现的公链在相关领域具体的进展。