现在还谈基本的设计模式,似乎很对不起大家,但是,如果你如果像我一样,得不断地向别人解释同一样东西,直到口水都干了的时候,你就会能够体会我的心境。

  现在的设计模式的书并不是很多(.net的),很多一部分人并不知道去java的书籍学习一些编程上的思想,所以,只有写写系列文章,以后谁再问我时,我就说,去cnblog上面看去,多快乐

我不想用很模糊的语言来描述它,只想用最一般的话来修正它,如果各位朋友能够指出我理解上的问题,当然更好,这个系列的文章我打算多写点,让一些初者减少迷茫。

首先,先看看设计模式手册中的描述吧。


         这个图,一开始看,确实让人有点晕乎晕乎的(特指不熟悉uml图),参照文字说明及图的表示,可以明白,handler实际上表现出了一个自我递归的关系。
  在设计模式中的职责链的意图是这样描述的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
  这句话的意思,就是指,你发送一个消息给一个对象,当这个对象发现这个消息不是自己能够处理或是自己想要的消息的时候,就把它转发给其它对象,直到有对象处理这个消息时就中止。
  一般说来,实现职责链的模式,有几个要点:
  1、每个对象中的代码,能够指出它要转发的对象,并能够说明自己是不是链中的最后一个对象,但这个指定不是由对象本身来自己指定,而是给出一个接口,由外部的实体来指定。
  2、有专门的类中,将各个对象链接起来。
  3、有发送信息的入口。
  
  在<<C#设计模式>>一书中,有一个例子就是,窗体上有几个控件,当你按下F1键时,消息会在控件间游走一遍,然后由控件自己来判断响不响应消息。
  我认为,这个例子不是很直观,而且可以算得上是不良的设计,或者说是把设计模式滥用了。
  试想一下,如果你在窗体上删除一个控件,你将不得不在链接各个对象的类中,把相关代码删除掉。如果是添加一个控件,则你必须得在添加的控件中加入能够指明它是否还有转发对象,是否是链中的最后一个对象的代码。不仅如此,如果控件量比较大,要写出的多出来的代码可不是开玩笑的。相比之下,你每添加一个控件,然后就针对它的keypress事件添加代码,不但简单,而且高效(消息不必循环一个链),添加与删除也容易得多。

  高效、易扩展,这才是设计模式能够被广泛使用的本质,要理解清楚该模式的真正作用,然后才能很好的使用。

  根据职责链的适用性,我们可以得出如下的理解。
  职责链模式的使用,一般针对于此类情况:
  1、发送一条消息,但你只要求对象处理消息是有次序的,并且只要有对象处理这个消息时就中止。
  2、发送一条消息,你并不知道究竟有一个还是多个对象需要处理该消息。这时,你就可以设计一个入口点,让这些不确定哪些才会响应消息的对象形成一个链条,然后让它们自己来判断是否响应消息。
  而且上述的内容不应是固定不变,在程序中,你可以自由而灵活地指定,比如,你可以指定各个对象响应消息的先后次序,这些都是动态的。

  “动态的”,请注意一下这个词语,这是职责链中最灵活的部分了,它能够发挥的功效也在这里体现。
   职责链可以用于这类场景:
   当你制定了一个业务流程,然后你的程序都是按此业务流程所办理,但需求突然变更了,客户说它调整了处理流程(修改了资料或添加了新的流程),要求程序要相应的更改。此时,如果你对业务流程中的消息传递是采用职责链来完成的,你的事情就好办了,只须调整一下处理对象的次序或增加一个对象,然后只需修改极少量,甚至不用修改其它的代码就可以方便地满足用户的需要。

   举一个实际生活中的处理的例子:
   学校里的学生,在进校时,到财务部先盖章,然后到后勤部盖,这个流程表示先交钱,再领东西。而毕业时,反了过来,先要到后勤部盖,再到财务部盖,表示的是退了东西,然后可以去领退的钱。
   如果采用一般的处理方式,因为是两个对象,往往会考虑采用一个bool变量来表示另一个部门的章是否已盖,但当你的程序做好了后,如果学校突然告诉你,它们的流程改变,中间还要到学生处盖个章,那么,就会出极大的问题。
   这种情况下,采用了职责链的话,因为在职责链中,每一个对象都需要指明它的后面是否还有链接,所以,这个流程无论是添加还是删除了中间的处理过程,都不会影响到你总体的设计。
  实践的办法就是,为每一个部门建立bool值,表示章盖了没有。
  虽然取决于先后的关系是章盖了没有,但现在,你可以让其中一个对象响应消息,然后在应该盖章的地方作上已盖的标记,如果不产生已盖标识的情况下,就中止消息的处理和传递,这样,每个对象只需处理到来的消息,而无须关系其它对象的状态,可以让对象之间的耦合度降低。
        
  也许某些朋友会问,你以上的处理方法(中止消息的处理和传递)似乎与“将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。”这句话的原则有些不同,原文是指这条链中没有消息响应则转发,好像有些不一样。
  实际上,在上面所述的链条中,每一条消息都被处理了,因为上面所述链条比较简单,中间没有穿插其它的描述,为了方便理解,我们设想如下场景:
  后勤处->学生处->财务处,对于一些聪明的学校,为了达到学生在各处注册的最高效,于是便在中间针对某些班级插入了“学生处”的盖章,从而减轻一部分从“后勤处”到“财务处”的压力,很不幸地是,你就遇见了这种聪明的学校,所以你必须处理它。
  这里只有财务处才管后勤处盖没盖章,中间的学生处却并不关心你在其它地方盖章没有,因为它只管理你的档案注册(某些学校不一样的是,要求你先办完所有手续,然后才到在学生处报道,同样的,也可以参考类似的办法来处理)。实际上的整个流程处理的核心消息是盖章这一点,这里屏掉了每个对象对其它对象的状态检测,而只是采用了简单的,不干这个就不能干那个方法来处理。这样,问题就简单了许多,尤其是针对复杂的业务操作的时候,采用职责链,可以在保护各个对象间的关系不变的情况,自由地变换处理流程。
  现在回过头来看,很明显,上述方法,基本可以满足我们的需求,因为对象之间不发生干预关系,你可以自己地调整流程。
  但是,上述结构也有一些不良之处,因为它的适应性还不够,上述方法只能适合于某一个学校的状况,但并不适合所有学校的情况,根源是在于,我们使用职责链模式时,实际采用的是类似于数据结构中的链表结构。
  对于更复杂的需求,在进行对象间的链接的时候,可以考虑采用更复杂的结构描述,比如说,树形结构,这样,就可以充分利用已有的知识,在进行对象间的访问策略时,可以充分利用树的特性,从而达到已有的知识利用的目的,比如:可以利用高效的递归,简化问题的处理。
  采用树形结构时,可以考虑,采用只有一个入口点的方式,针对有分支的地方,采用专门的决策对象进行处理,这时就需要结合到其它的模式,一般说来,链的处理,考虑时,采用越简单的建模越能有效地提高可维护性,降低对象维护的难度。

实际上,设计模式中的任何一种模式,对于一个经常搞开发的人来说,已经自动地使用了其中一种或多种模式,但也有人可能熟悉其中的一到两种模式,对于这类人来说,熟悉一下设计模式,对于提高编程开发的效率和软件成品的质量,是十分有帮助作用的。

注:上述仅是个人理解,如有不妥之处,请指出。

转载于:https://www.cnblogs.com/William_Fire/articles/28413.html

设计模式之职责链(Chain of Responsibility)相关推荐

  1. 职责链( Chain of Responsibility)模式

    职责链( Chain of Responsibility)模式 职责链模式动机(Motivation) ➢在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指 ...

  2. java使命召唤_Java设计模式之从[使命召唤等游戏的任务提示]分析职责链(Chain Of Responsibility)模式...

    我们在使命召唤.暗黑破坏神等游戏时,总会接到各种各样的游戏任务,如到某某地方解救某人,或者消灭某某地方的敌人等.当玩家进入到某一个地图(以下称之为游戏场景)时,我们就可以查看它的任务提示.在这个机制下 ...

  3. 设计模式学习笔记——责任链(Chain of Responsibility)模式

    设计模式学习笔记--责任链(Chain of Responsibility)模式 @(设计模式)[设计模式, 责任链模式, chain of responsibility] 设计模式学习笔记责任链Ch ...

  4. python设计模式案例分析_Python设计模式之职责链模式原理与用法实例分析

    本文实例讲述了Python设计模式之职责链模式原理与用法.分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接 ...

  5. 【设计模式】—— 职责链模式ChainOfResponsibility

    模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因 ...

  6. 设计模式之职责链模式应用例题

    设计模式之职责链模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 在军队中,一般根据战争规模的大小和重要性由不同级别的长官(Officer)来下达作战命令,情报人员向上级递交军 ...

  7. 【设计模式】职责链模式(C#)

    [设计模式]职责链模式 1.概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假或者加薪,可处理的领导有HR.部门负责人.副总经理. ...

  8. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路

    23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...

  10. C++设计模式——职责链模式(responsibility chain pattern)

    一.原理讲解 1.1意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2应用场景 有多个对象可以处 ...

最新文章

  1. ReentrantLock+线程池+同步+线程锁
  2. c#web页面显示弹窗_C#监听IE文档加载完成、弹窗、JS弹窗、页面跳转
  3. VII python面向对象
  4. java中scanner if用法_Java通过Scanner了解if...else if语句
  5. 【Flutter】打开第三方 Flutter 项目
  6. 用特征光谱分类神经网络
  7. tf.reduce_max用法
  8. Oracle用户相关命令
  9. [网络安全提高篇] 一〇八.Powershell和PowerSploit脚本渗透详解 (1)
  10. C#使用Ado.net读取Excel表的代码
  11. Ui5 tool debug - ctrl alt shift s
  12. java 合并单元格 把数据合并没了_合并单元格
  13. php rinit,PHP执行原理
  14. 4-adjacent(AtCoder-2686)
  15. OpenStack的八年之痒
  16. 著名线性代数教授 85岁麻省理工学院教授,给2020本科生教授《线性代数入门》
  17. 计算机专业计算机二级java有用吗_计算机二级java含金量如何 对就业有帮助吗
  18. mysql自动全量更新表_MySQL数据库自动全量备份脚本
  19. 冰桶挑战:一个吊炸天的病毒式营销案例剖析
  20. 【转载】树莓派 Raspberry Pi Pico windows7 串口驱动

热门文章

  1. 常用linux解压命令(原创)
  2. express url跳转(重定向)的实现:res.location() res.redirect()
  3. Week2——XML
  4. jQuery EasyUI 简介
  5. AI编辑SVG格式的相关问题
  6. JavaScript 函数参数是传值(byVal)还是传址(byRef)?
  7. 【转载】SQL Server 2005关于数据类型最大值(3)
  8. (翻译)《介绍 GENEVA Beta 1 白皮书》(3)
  9. java day52【综合案例day04】
  10. halcon图像处理的基本思路