CHAIN OF RESPONSIBILITY(职责链)—对象行为型模式

  1. 意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

  1. 动机

考虑一个图形用户界面中的上下文有关的帮助机制。用户在界面的任一部分上点击就可以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分以及其上下文。例如,对话框中的按钮的帮助信息就可能和主窗口中类似的按钮不同。如果对那一部分界面没有特定的帮助信息,那么帮助系统应该显示一个关于当前上下文的较一般的帮助信息---比如说,整个对话框。

因此很自然地,应根据普遍性( g e n e r a l i t y )即从最特殊到最普遍的顺序来组织帮助信息。而且,很明显,在这些用户界面对象中会有一个对象来处理帮助请求;至于是哪一个对象则取决于上下文以及可用的帮助具体到何种程度。这儿的问题是提交帮助请求的对象(如按钮)并不明确知道谁是最终提供帮助的对象。我们要有一种办法将提交帮助请求的对象与可能提供帮助信息的对象解耦( d e c o u p l e )。Chain ofR e s p o n s i b i l i t y模式告诉我们应该怎么做。这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者。该请求沿对象链传递直至其中一个对象处理它,如下图所示。

从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不明确地知道哪一个对象将会处理它---我们说该请求有一个隐式的接收者(implicit receiver)。

假设用户在一个标有"P r i n t" 的按钮窗口组件上单击帮助,而该按钮包含在一个P r i n t D i a l o g的实例中,该实例知道它所属的应用对象(见前面的对象框图)。下面的交互框图(diagram) 说明了帮助请求怎样沿链传递:

在这个例子中,既不是aPrintButton 也不是aPrintDialog 处理该请求;它一直被传递给a n A p p l i c a t i o n,anApplication 处理它或忽略它。提交请求的客户不直接引用最终响应它的对象。

要沿链转发请求,并保证接收者为隐式的( i m p l i c i t ),每个在链上的对象都有一致的处理请求和访问链上后继者的接口。例如,帮助系统可定义一个带有相应的HandleHelp 操作的H e l p H a n d l e r类。HelpHandler 可为所有候选对象类的父类,或者它可被定义为一个混入(m i x i n)类。这样想处理帮助请求的类就可将HelpHandler 作为其一个父类,如下页上图所示。按钮、对话框,和应用类都使用HelpHandler 操作来处理帮助请求。H e l p H a n d l e r的HandleHelp 操作缺省的是将请求转发给后继。子类可重定义这一操作以在适当的情况下提供帮助;否则它们可使用缺省实现转发该请求。

相关推荐
蝸牛ちゃん1 小时前
软件需求工程详解
需求分析·需求管理·需求工程
非凡ghost8 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
Binary_ey1 天前
汽车高位制动灯难达 CIE 标准?OAS 光学软件高效优化破局
汽车·软件需求·光学软件·车灯设计
青草地溪水旁1 天前
UML函数原型中constraint的含义,有啥用?
c++·uml
蝸牛ちゃん1 天前
大型软件需求变更管理:从混沌到可控的工程化实践
网络·需求分析·变更管理·需求变更
Binary_ey1 天前
汽车后雾灯色度难达标?OAS 软件精准解决破瓶颈
软件需求·hud·光学软件·车灯设计
非凡ghost2 天前
Control Center 安卓版:个性化手机控制中心
android·智能手机·生活·软件需求
找不到、了2 天前
Java设计模式之《原型模式》--深、浅copy
java·设计模式·原型模式
卓码软件测评2 天前
网站测评-利用缓存机制实现XSS的分步测试方法
java·后端·安全·spring·可用性测试·软件需求
IT小白架构师之路5 天前
常用设计模式系列(十八)-责任链模式
设计模式·责任链模式