- 浏览: 1684532 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 751简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 895简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2574简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1483简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 852简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12339简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 2011简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 939简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2798简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2707简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3568简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2518简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3716简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4073简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3449简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 909简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4649简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2202简介 在之前的一 ...
相关推荐
责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。这种模式的主要优点是解耦了发送者和接收者之间的关系,使得系统更加灵活,...
职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求的发送者和接收者解耦,使得多个对象都有可能处理一个请求,而无需显式指定接收者。在这个模式中,请求沿着一个处理者链进行传递,...
职责链模式(Chain of Responsibility)是一种行为型设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。在C#中,职责链模式的应用可以帮助我们构建灵活、可扩展的系统,减少对象...
在本篇文章中,我们将深入探讨C#中的Chain of Responsibility(职责链)模式,这是行为型设计模式的一种。虽然标题提到的是“TemplateMethod模板方法”,但从内容来看,实际上探讨的是职责链模式。为了更好地理解这...
责任链(Chain of Responsibility)模式是一种行为设计模式,它允许我们向对象链中传递请求,让每个对象决定是否处理这个请求。在Java中,这种模式常用于事件处理、日志系统或者权限控制等场景,其核心思想是将处理...
责任链模式是一种行为设计模式,它允许我们向多个对象中的一个发送请求,而无需知道哪个对象会处理这个请求。...在`chain-of-responsibility-demo`中,你可以通过分析代码结构和逻辑,深入理解这一模式的应用及其优势。
责任链模式(Chain of Responsibility)是一种行为设计模式,它允许我们向多个对象中的一个发送请求,而无需指定接收者是谁。这种模式的核心思想是将处理请求的对象形成一条链,请求在链上的对象间传递,直到被某个...
**PHP设计模式:Chain Of Responsibility(职责链模式)** 职责链模式是一种行为设计模式,它的主要目的是解耦请求的发送者和接收者,通过创建一个处理请求的对象链,使得多个对象都有机会处理这个请求。在PHP中,...
- Chain of Responsibility模式:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 - Iterator模式:提供一种方法...
例如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...
15. 责任链模式(Chain of Responsibility Pattern):在该模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。 16. 策略模式(Strategy Pattern):定义一个算法家族,将它们一个个封装,并使它们...
2. 责任链模式(Chain of Responsibility Pattern):避免对象之间的耦合,通过将请求沿着处理者链传递,直到有处理者处理该请求。 3. 命令模式(Command Pattern):将命令封装为一个对象,以便使用不同的请求、...
- 责任链模式(Chain of Responsibility):避免硬编码调用链,将请求沿着处理者链进行传递。 - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求或支持可撤销的操作。 - 解释器模式...
- 责任链模式(Chain of Responsibility):避免将请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。 - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持撤销...
这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...
- 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到有处理者处理请求。 - 命令模式(Command):将命令封装为对象,以便于使用参数化客户端、支持撤销操作以及记录日志等。 - 解释器模式...
- 责任链模式(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起,使多个对象都有可能处理请求。 - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求或支持可撤销的...
15、CHAIN OF RESPONSIBILITY模式:使多个对象都有机会处理请求,直到找到合适的对象为止。 16、COMMAND模式:将请求封装成对象,从而使得可以使用不同的请求队列、日志记录请求、撤销操作等。 17、INTERPRETER模式...
如命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、观察者模式(...方法模式(Template Method)和职责链模式(Chain of Responsibility)...
我们将主要关注以下几个设计模式:Adapter、Chain of Responsibility 和 Singleton,这些都是Java编程中极为重要的设计模式。 1. **适配器模式(Adapter)**: 适配器模式是一种结构型设计模式,它允许不兼容的类之间...