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

Chain of ressponsibility 模式——推卸责任

1、什么是推卸责任?

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

1、Chain of ressponsibility 模式的重要性

弱化“请求方”和“处理方”之间的关联关系,让双方各自都成为可独立复用的组件。

程序可对付其他需求,如根据情况不同,负责处理的对象也会发生变化的这种需求。

2、示例程序

示例程序类

Trouble 表示发生的问题的类。它带有问题的编号(number)

Support用来解决问题的抽象类

NoSupport用来解决问题的具体类(永远不处理问题)

LimitSupport用来解决问题的具体(仅解决编号小于指定编号的问题)

OddSupport用来解决问题的具体(仅解决奇数编号问题)

SpecialSupport用来解决问题的具体(仅解决指定编号的问题)

Main制作Support职责链,制造问题并测试程序行为。

示例程序类图

Trouble类

Support类

NoSupport类

LimitSupport类

OddSupport类

SpecialSupport类

Main类

运行结果

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

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

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

Handler(处理者)

Handler角色定义了处理请求的接口(API)。Handler角色知道“下一个处理者”是谁,如果自己无法处理请求,他会将请求转给“下一个处理者”。当然,“下一个处理者”

ConcreteHandler(具体的处理者)

Client(请求者)

拓展思路的要点

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

Chain of responsibiliy模式最大的优点在于弱化了发出请求的人(Client角色)和处理请求的人(ConcreteHandler)之间的关系。Client角色向第一个ConcreteHandler角色发出请求,然后会在职责链中传播,直到某个ConcreteHandler角色处理该请求。

既然知道Chain of responsibiliy模式这么伟大,那么,如果它不存在,那么我们该如何处理请求呢?

很明显,如果不采用推卸责任的方式去处理请求,那么我们就必须有这样一个伟大的角色知道“谁应该处理什么请求”。显然,让“发出请求的人”知道“谁应该处理该请求”,会降低其作为可复用组件的独立性。

可以动态地改变职责链

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

但是假设上面的6个角色中的某些角色之间的关系可能会发生变化,如果委托推卸责任,就能根据情况变化动态地重组职责链。

假设不使用责任链模式,而是在程序中下达死命令“某个程序需要谁处理”这样的对应关系,那么很难再程序运行中去改变请求的处理者。

一个很实在的栗子:chain of responsibility 模式在视窗系统中的发挥了很大的作用。

专注于自己的工作

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

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

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

相关的设计模式

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方法,完成责任的细分。

原文地址:https://www.cnblogs.com/Erma/p/10330766.html

时间: 2024-10-16 15:52:17

jfinal ——Handler 之 责任链模式(chain of)的相关文章

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

责任链模式-Chain of Responsibility(Java实现), 例1

责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. Trouble类 本类是:待责任链来处理的问题Trouble类. 本例子较简单, Trouble只有一个int型作为待处理的编号. public class Trouble { private int number; public Trouble(int number) { this.number

设计模式之二十:责任链模式(Chain of Responsibility)

感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合.将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理. UML类图: 主要包含: Handler:定义了一个处理请求的接口,实现了定义后继者的方法. ConcreteHandler:处理各自负责的请求,假设不能处

责任链模式(Chain)

前言:责任链模式在很多框架中都有体现,比如Spring,Mybatis等. 概念:使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象串成一条链,并沿着这条链一直传递该请求,直到有对象处理它为止.责任链模式的重点在“链上”,由一条链去处理相似的请求,在链中决定谁来处理这个请求,并返回相应的结果. 生活场景:在公司上班,遇到突发事件都需要请假,而请假根据天数不同需要不同的主管来同意我们的请求,比如我们要请1-3天的假期一级主管就可以直接同意,不需要再往上请求,如果

设计模式 笔记 责任链模式 chain of responsibility

//---------------------------15/04/25---------------------------- //Chain of responsibility 责任链-----对象行为型模式 /* 1:意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象 连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2:动机: 3:适用性: 1>有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 2>你想在不明确指定

[设计模式] 责任链模式 Chain of Responsibility

转    http://blog.csdn.net/wuzhekai1985   http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向项目主管提交了我的休假申请,项目主管向部门经理提交了我的休假申请:最后,部门经理同意了我的休假申请.是的,一个简单的休假申请,需要这么复杂的流程,这也是一个公司保证它正常运行的必要.如果部门经理休假了,那么我的休假申请由谁审批呢?这个时候由项目主管代替部门经理进行审批.一个休假申请的审批制度有着严格

B5:责任链模式 Chain Of Responsibility

使多个对象都有机会处理处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着该链处理请求,直到有一个对象能够处理它为止. UML 示例代码: abstract class Handle { protected $nextHandle; public function setNextHandle(Handle $handle) { $this->nextHandle = $handle; } abstract public function handleRequest(

责任链模式(Chain of responsibility pattern)

鲁春利的工作笔记,好记性不如烂笔头 本文出自 "闷葫芦的世界" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1892886

GOF23设计模式之责任链模式(chain of responsibility)与结构型模式总结经典

 责任链模式:Chain of responsibility      将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象. 场景:      打牌时,轮流出牌.      接力赛跑      大学中,奖学金审批.      公司中,公文审批.   结构型模式汇总: 代理模式:为真实对象提供一个代理,从而控制对真实对象的访问. 适配器模式:使原本由于接口不兼容不能一起工作的类,可以一起工作. 桥