将多个对象组成一条职责链,而后按照它们在职责链上的顺序来逐个找出到底应该谁来负责。设计模式
弱化“请求方”和“处理方”之间的关联关系,让双方各自都成为可独立复用的组件。
程序可对付其余需求,如根据状况不一样,负责处理的对象也会发生变化的这种需求。框架
Trouble 表示发生的问题的类。它带有问题的编号(number)
Support用来解决问题的抽象类
NoSupport用来解决问题的具体类(永远不处理问题)
LimitSupport用来解决问题的具体(仅解决编号小于指定编号的问题)
OddSupport用来解决问题的具体(仅解决奇数编号问题)
SpecialSupport用来解决问题的具体(仅解决指定编号的问题)
Main制做Support职责链,制造问题并测试程序行为。测试
下图展现了各个责任链在调用下一个Support方法以前都会先调用自身的resolve方法。
设计
Handler角色定义了处理请求的接口(API)。Handler角色知道“下一个处理者”是谁,若是本身没法处理请求,他会将请求转给“下一个处理者”。固然,“下一个处理者”3d
Chain of responsibiliy模式最大的优势在于弱化了发出请求的人(Client角色)和处理请求的人(ConcreteHandler)之间的关系。Client角色向第一个ConcreteHandler角色发出请求,而后会在职责链中传播,直到某个ConcreteHandler角色处理该请求。
既然知道Chain of responsibiliy模式这么伟大,那么,若是它不存在,那么咱们该如何处理请求呢?
很明显,若是不采用推卸责任的方式去处理请求,那么咱们就必须有这样一个伟大的角色知道“谁应该处理什么请求”。显然,让“发出请求的人”知道“谁应该处理该请求”,会下降其做为可复用组件的独立性。对象
在前面的示例程序中,问题解决的次序以下:
blog
可是假设上面的6个角色中的某些角色之间的关系可能会发生变化,若是委托推卸责任,就能根据状况变化动态地重组职责链。
假设不使用责任链模式,而是在程序中下达死命令“某个程序须要谁处理”这样的对应关系,那么很难再程序运行中去改变请求的处理者。
一个很实在的栗子:chain of responsibility 模式在视窗系统中的发挥了很大的做用。接口
ConcreteHandler勇敢地说不,才能让它专一于本身的工做,假如咱们不使用责任链模式,首先得有一个“选举哪一个ConcreteHandler该负责什么样处理”的方法。或者是每一个ConcreteHandler本身负责“任务分配工做”,即“本身不能处理的转交给别人”。ci
回答是确定的,接受到请求以后并不能立马去处理请求,因此会致使延迟。若是说责任和处理者之间的关系是明确的,那么咱们应该放弃Chain of responsibiliy模式。it
Handler角色会常常使用Composite 模式
有时会使用Command模式向Handler角色发送请求。
首先经过Main方法启动项目,发送请求给doFilter完成项目的真正启动,在这里实现handler的初始化还有调用责任链,handler经过HandlerFactory定义了责任链规则。在这里实现Handler有两种方式:
1)自定义handler,如类图中的DemoHandler;
2)调用Jfinal中handler; jfinal框架中有ContextPathHandler、FakeStaticHandler、ServerNameRedirect301Handler、ActionHandler,这些ConcreteHandler经过集成Handler,实现Handler中抽象Handle方法,完成责任的细分。