设计模式系列 – Chain of Responsibility模式

1、引入:从击鼓传花谈起

  击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,网站空间,则该人就得饮酒。  假比说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,美国空间,他们组成一个环链。击鼓者将花传给贾母,香港服务器,开始传花游戏。花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图)。当鼓声停止时,手中有花的人就得执行酒令。  图1、击鼓传花。  击鼓传花便是责任链模式的应用。在责任链模式里,很多的对象由每一个对象对其下家的引用而联接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。  责任链可能是一条直线、一个环链甚至一个树结构的一部分。2、责任链模式的结构

 GoF对职责链模式的定义为:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。通俗一点说就是,当客户提交一个请求时,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不知道哪一个对象将会处理它。当然职责链中也可能没有可以处理该请求的对象,这种情况是允许发生的。

 责任链模式是一种对象的行为模式,它所涉及到的角色如下:  第一、抽象处理者(Handler)角色、定义出一个处理请求的接口;如果需要,接口可以定义出一个方法,以返回对下家的引用。下图给出了一个示意性的类图:  图2、抽象处理者角色。  在图中的积累关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。  第二、具体处理者(ConcreteHandler)角色、处理接到请求后,可以选择将请求处理掉,或者将请 求传给下家。下图给出了一个示意性的类图。      图3、具体处理者角色。  上图中的示意性的具体处理者ConcreteHandler类只有handleRequest()一个方法。  责任链模式的静态类结构可见下图:   

  图4、责任链模式的类图定义。

3、代码实例

【注意】

1、与观察者模式的区别

观察者模式重点在于变化是通知各个观察者,各观察者观察到的信息是相同的;而责任链模式在于使用链条的方式处理发送的内容,链条的前一环节处理之后的内容传递到下一环节,前面处理的结果可能会对后面的处理有影响。

2、与装饰者模式的区别

装饰者模式重点在于加上各种修饰;责任链模式重在各个链条的处理,在调用的前后加上各种处理,中间可能存在堆栈调用的问题, 存在A前->B前->B后->A后的堆栈调用的情况。

从起点,到尽头,也许快乐,或有时孤独,

设计模式系列 – Chain of Responsibility模式

相关文章:

  • 【算法】直接插入排序C语言实现
  • 嵌入式 FAAC1.28 在海思HI3518C/HI3518A平台linux中的编译优化
  • Android 动画animation 深入分析
  • Mybatis极其(最)简(好)单(用)的一个分页插件
  • Ext JS Kitchen Sink [Learning by doing](2)ArrayGrid
  • API开发第三篇:PHP的设计模式之完美的单例模式
  • 使用NGUI时遇到物理引擎错误
  • [redis]redis命令汇总(二)
  • 你感兴趣的文章:

    标签云:

    亚洲高清电影在线, 免费高清电影, 八戒影院夜间, 八戒电影最新大片, 出轨在线电影, 午夜电影院, 在线影院a1166, 在线电影院, 在线观看美剧下载, 日本爱情电影, 日韩高清电影在线, 电影天堂网, 直播盒子app, 聚合直播, 高清美剧, 高清美剧在线观看 EhViewer-E站, E站, E站绿色版, qqmulu.com, qq目录网, qq网站目录,