- 浏览: 1666351 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (335)
- uml (11)
- java (318)
- python (11)
- socket (2)
- ant (1)
- data structures (58)
- algorithms (67)
- concurrency (16)
- multithreading (16)
- mysql (2)
- ubuntu (2)
- c语言 (1)
- lucene (0)
- elasticsearch (0)
- django (1)
- 读书 观点 (2)
- 读书 (4)
- 观点 (4)
- collections (8)
- nio (1)
- io (2)
- 系统集成 (1)
- activemq (2)
- restful (0)
- web service (0)
- HttpClient (1)
- serializable (0)
- annotation (1)
- jdbc (3)
- classloader (0)
- regular expression (1)
- jpa (4)
- jvm (0)
- reflection (1)
- commons-pool2 (2)
- javamail (1)
- velocity (1)
- mathematics (3)
- graph (13)
- LeetCode (159)
- scala (0)
- spring (24)
- maven (5)
- spring batch (1)
- quartz (2)
- IOC (2)
- ORM (3)
- hibernate (2)
- aop (4)
- redis (0)
- zookeeper (0)
- spring mvc (4)
- ELK (1)
- string (1)
- gradle (1)
- mybatis (5)
- docker (0)
- servlet (0)
- log4j2 (1)
- html (0)
- css (0)
最新评论
-
nucleus:
貌似是因为图片的路径是http的缘故:http://dl2.i ...
spring container 实现分析:BeanWrapper -
nucleus:
nucleus 写道BeanWrapper这一块相关的类结构如 ...
spring container 实现分析:BeanWrapper -
nucleus:
BeanWrapper这一块相关的类结构如下图:文中提到的上述 ...
spring container 实现分析:BeanWrapper -
leshy:
inventory.sort(Comparator.compa ...
java8 lambda表达式学习总结 -
Leisurez:
di1984HIT 写道xuexile~hahaha~
activemq的几种基本通信方式总结
引子
假定我们设想某一个场景,在一个工厂里我们需要经过一系列的工序要生产加工产品。这些生产工序在工厂中我们一般称之为流水线。这些流水线有一个比较有意思的特性,就是每一个步骤是针对生产过程中某一个方面起作用,比如对产品的锻造、抛光,包装等。同时他们所进行的所有行为都是围绕着同一个产品,有严格的顺序要求。做完某一步之后就接着到下一步。
模式的基本概念
前面的工厂流水线可以作为chain of responsibility模式的一个类比。和流水线类似,在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
该模式的结构图如下:
从图中我们可以看到,我们定义的抽象基类Handler包含有一个指向自身类型的引用。而具体的实现ConcreteHandler1, ConcreteHandler2等可以针对不同的方面做具体的处理实现,这些实现类在处理完该方面之后再将请求转发给下一个。由于successor的引用,我们可以构成一个链表类型的结构,将所有的具体实现类给串起来。
一个参考实现
在实际的实现和应用中,可能会有几种选项我们可以考虑。一个是可以将请求传递整个责任链条,在每个处理节点handler上面选择自己能否处理,否则就传递给下一个。这相当于实际上只有一个handler真正处理了,其他的都是传递的。碰到真正处理的就已经返回了。另外,也可以若干个handler每个都处理一部分,然后直到某个节点处理完毕返回。这些情况都可以。假定我们选择地一种情况。
对应的代码分别如下:
Handler: 一方面定义了一个链表结构的基础,同时也作为一个抽象的基类给具体子类来实现。
public abstract class Handler { // Fields protected Handler successor; // Methods public void setSuccessor( Handler successor ) { this.successor = successor; } public abstract void handleRequest( int request ); }
ConcreteHandler1, ConcreHandler2分别作为两个具体的Handler子类实现:
// "ConcreteHandler1" public class ConcreteHandler1 extends Handler { // Methods override public void handleRequest( int request ) { // if match the handle condition... else if( successor != null ) successor.HandleRequest( request ); } } // "ConcreteHandler2" public class ConcreteHandler2 extends Handler { // Methods override public void handleRequest( int request ) { // if match the handle condition... else if( successor != null ) successor.handleRequest( request ); } }
在具体调用整个责任链的时候,我们可以使用如下的代码:
// Setup Chain of Responsibility Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); h1.setHandler(h2);
h1.handleRequest(3);
我们可以看到,在代码中,我们手工构建一个链表,然后调用handleRequest方法。从表面上看就是h1执行了handleRequest方法,实际上根据需要可能会有h1将请求传递到后面的h2。这就是传递中最核心的部分。
和其他模式的对比
和observer pattern的比较
如果我们和observer pattern的思路进行比较,会发现他们在一定程度上有很大的相似性。下图是observer pattern的类结构图。
经过比较,我们会发现。chain of responsibility模式里面所有的handler都有一个指向后面的引用,形成了一个链表的样式。通过一个接一个的传递来处理请求。而observer pattern里所有注册的观察者也可以通过一个list,也可以是链表的方式来得到通知。在observer pattern相当于将process这个处理的方法抽象成一个独立的接口,而且一般将所有注册链的过程封装在抽象基类里。而在chain of responsibility里会手工来构造这个处理链。这里像一个工厂的流水线,强调流程以及顺序。每一个handler相当于其中的某一道加工工序,这样就不能允许出现顺序错乱。所以该模式比较强调一个比较灵活的强调顺序的过程。
另外一方面,chain of responsibility允许所有的handler都有机会来处理请求,但不一定要所有的handler都来处理,在具体的handler可能只是起到一个转发的作用。而observer patter中所有的观察者都相当于一个关注者,他们当事件触发的时候相当于所有人都有动作,而不是有的有而有的没有。不存在前面一个传递到后面一个的概念。而observer pattern强调一个对事件通知的分离,并不强调观察者行动的顺序性。只要所有注册的观察者被通知到就可以了,至于谁先被通知,谁后被通知都无所谓。
和template method的比较
template method模式和它也有很多相似的地方。下面是template method模式的结构图。
template method模式也强调一个过程,一般会是在抽象基类里定义好了一个过程需要的步骤。每个步骤对应一个方法,具体方法的实现依赖于实现的子类。和chain of responsibility模式比起来,这个模式里定义的过程是固定的,如果需要调整的话就要调整基类里的方法。而在chain of responsibility模式中handler是可以根据需要组合的,相对来说更加有灵活性。
总结
chain of responsibility模式本身比较简单,就相当于抽象出一个处理的接口然后用构造链表的方式来把各具体的处理步骤串联起来。在实际应用中可能包括有单个处理并返回或者多个处理返回的情况。一些典型的应用包括MINA里面Filter chain实现,就用到了该模式并采用了第二种方式。而另外一个在Apache commons chain的开源实现中,它采用了第一种方式。这些具体实现会在后面一篇文章中详细分析。
参考资料:
发表评论
-
spring源代码分析:aop的实现
2018-10-03 23:32 687简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 833简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2454简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1399简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 786简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12192简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 1853简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 870简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2651简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2598简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3477简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2464简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3647简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4006简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3385简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 842简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4530简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2115简介 在之前的一 ...
相关推荐
这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...
1. 面向对象综述 ...18. Strategy、State、Template Method、Command、Chain of Responsibility、Observer、Mediator 19. ,Interpreter、Iterator、Memento、Visitor、Collecting Parameter 20. 总结
本电子书一共两个压缩文档,本文件为part2. ...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract ...
本电子书一共两个压缩文档,该文档为part1。...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
8.3.2 Chain of Responsibility模式 8.4 Model-View-Controller 8.4.1 ViewModel模式 8.4.2 ASP.NET MVC框架 8.4.3 利用AutoMapper映射ViewModel 8.4.4 Castle MonoRail 8.5 Page Controller模式 8.6 小结 ...
完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
完整清晰版,完美书签. 《研磨设计模式》完整...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
完整清晰版,完美书签. 《研磨设计模式》完整...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
完整清晰版,完美书签. 《研磨设计模式》完整...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
完整清晰版,完美书签. 《研磨设计模式》完整...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
主要介绍了深入理解JavaScript系列(38):设计模式之职责链模式详解,职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,需要的朋友可以参考下
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。 Command:将一个请求封装为一个对象...
责任链模式(Chain of Responsibility) 3.2 命令模式(Command) 3.3 解释器模式(Interpreter) 3.4 迭代器模式(Iterator) 3.5 中介者模式(Mediator) 3.6 备忘录模式(Memento) 3.7 观察者模式(Observer) ...
设计模式之 Chain of Responsibility(责任链) 各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个. 设计模式之 Mediator(中介) Mediator 很象十字路口的红绿灯,每个车辆只需和红绿灯交互...
Design-patterns java23种设计模式,深入理解灵活运用设计模式对于优化代码质量,提高编程能力非常必要! Blog 设计模式 module blog 单例模式 Singleton pattern ...Chain of responsibility model
NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一...