jfinal ——Handler 之 责任链模式(chain of)

Chain of ressponsibility 模式——推卸责任

一、什么是推卸责任?

将多个对象组成一条职责链,而后按照它们在职责链上的顺序来逐个找出到底应该谁来负责。设计模式

一、Chain of ressponsibility 模式的重要性

弱化“请求方”和“处理方”之间的关联关系,让双方各自都成为可独立复用的组件。
程序可对付其余需求,如根据状况不一样,负责处理的对象也会发生变化的这种需求。框架

二、示例程序

示例程序类

Trouble 表示发生的问题的类。它带有问题的编号(number)
Support用来解决问题的抽象类
NoSupport用来解决问题的具体类(永远不处理问题)
LimitSupport用来解决问题的具体(仅解决编号小于指定编号的问题)
OddSupport用来解决问题的具体(仅解决奇数编号问题)
SpecialSupport用来解决问题的具体(仅解决指定编号的问题)
Main制做Support职责链,制造问题并测试程序行为。测试

示例程序类图

Trouble类

Support类


NoSupport类

LimitSupport类

OddSupport类

SpecialSupport类

Main类

运行结果

解决Trouble363时的示例程序的时序图

下图展现了各个责任链在调用下一个Support方法以前都会先调用自身的resolve方法。
设计

三、chain of responsibility 模式中的登场角色

Handler(处理者)

Handler角色定义了处理请求的接口(API)。Handler角色知道“下一个处理者”是谁,若是本身没法处理请求,他会将请求转给“下一个处理者”。固然,“下一个处理者”3d

ConcreteHandler(具体的处理者)

Client(请求者)

拓展思路的要点

弱化了发出请求的人和处理请求之间的关系

Chain of responsibiliy模式最大的优势在于弱化了发出请求的人(Client角色)和处理请求的人(ConcreteHandler)之间的关系。Client角色向第一个ConcreteHandler角色发出请求,而后会在职责链中传播,直到某个ConcreteHandler角色处理该请求。
既然知道Chain of responsibiliy模式这么伟大,那么,若是它不存在,那么咱们该如何处理请求呢?
很明显,若是不采用推卸责任的方式去处理请求,那么咱们就必须有这样一个伟大的角色知道“谁应该处理什么请求”。显然,让“发出请求的人”知道“谁应该处理该请求”,会下降其做为可复用组件的独立性。对象

能够动态地改变职责链

在前面的示例程序中,问题解决的次序以下:
blog

可是假设上面的6个角色中的某些角色之间的关系可能会发生变化,若是委托推卸责任,就能根据状况变化动态地重组职责链。
假设不使用责任链模式,而是在程序中下达死命令“某个程序须要谁处理”这样的对应关系,那么很难再程序运行中去改变请求的处理者。
一个很实在的栗子:chain of responsibility 模式在视窗系统中的发挥了很大的做用。接口

专一于本身的工做

ConcreteHandler勇敢地说不,才能让它专一于本身的工做,假如咱们不使用责任链模式,首先得有一个“选举哪一个ConcreteHandler该负责什么样处理”的方法。或者是每一个ConcreteHandler本身负责“任务分配工做”,即“本身不能处理的转交给别人”。ci

推卸请求会致使处理延迟吗?

回答是确定的,接受到请求以后并不能立马去处理请求,因此会致使延迟。若是说责任和处理者之间的关系是明确的,那么咱们应该放弃Chain of responsibiliy模式。it

相关的设计模式

Composite 模式

Handler角色会常常使用Composite 模式

Command 模式

有时会使用Command模式向Handler角色发送请求。

jfinal的 Chain of responsibility模式

首先经过Main方法启动项目,发送请求给doFilter完成项目的真正启动,在这里实现handler的初始化还有调用责任链,handler经过HandlerFactory定义了责任链规则。在这里实现Handler有两种方式
1)自定义handler,如类图中的DemoHandler;
2)调用Jfinal中handler; jfinal框架中有ContextPathHandler、FakeStaticHandler、ServerNameRedirect301Handler、ActionHandler,这些ConcreteHandler经过集成Handler,实现Handler中抽象Handle方法,完成责任的细分。

相关文章
相关标签/搜索