1.意图

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

2.动机

给多个对象处理一个请求的机会,从而解耦发送者和接收者。

3.适用性

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

4.结构

5.代码实例

//Handler.h
#include <memory> class AbstractHandler
{
public:
virtual void HandleRequest() = ;
virtual void SetHandler(std::shared_ptr<AbstractHandler> pHandler);
protected:
std::shared_ptr<AbstractHandler> m_pHandler;
}; class BaseHandler : public AbstractHandler
{
public:
virtual void HandleRequest();
}; class ConcreteHandler1 : public BaseHandler
{
public:
void HandleRequest();
}; class ConcreteHandler2 : public BaseHandler
{
public:
void HandleRequest();
};
//Handler.cpp
#include <iostream>
#include "Handler.h" void AbstractHandler ::SetHandler(std::shared_ptr<AbstractHandler> pHandler)
{
m_pHandler = pHandler;
}; void BaseHandler ::HandleRequest()
{
std::cout << "Base Handler Handled" << std::endl;
}; void ConcreteHandler1 ::HandleRequest()
{
std::cout << "ConcreteHandler1 Handled" << std::endl;
m_pHandler->HandleRequest();
}; void ConcreteHandler2 ::HandleRequest()
{
std::cout << "ConcreteHandler2 Handled" << std::endl;
m_pHandler->HandleRequest();
};
//client

#include "Handler.h"

int main()
{ std::shared_ptr <AbstractHandler> pConcreteHandler1(new ConcreteHandler1); std::shared_ptr <AbstractHandler> pConcreteHandler2(new ConcreteHandler2); std::shared_ptr <AbstractHandler> pBaseHandler(new BaseHandler); pConcreteHandler1->SetHandler(pConcreteHandler2); pConcreteHandler2->SetHandler(pBaseHandler); pConcreteHandler1->HandleRequest(); while(); }

6.测试结果

以上结果为每个handler执行后均调用上一级的handler执行。

7.效果

  • 降低耦合度    该模式使得一个对象无需知道是其他哪一个对象处理其请求。
  • 增强了给对象指派职责的灵活性
  • 不保证被接受

Chain Of Responsibility(职责连)-对象行为型模式的更多相关文章

  1. 设计模式19:Chain Of Responsibility 职责链模式(行为型模式)

    Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请 ...

  2. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  3. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  4. C#设计模式之二十一职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中 ...

  5. C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例子吧,理解起来可能更 ...

  6. 设计模式学习笔记——Chain of Responsibility职责链模式

    重点在链.一条链,如果本节点处理不了,则传递给下一个节点处理. 关键是如何传给下一个节点? 主要是由本节点决定传给哪一个节点. public class Client { public static ...

  7. singleton(单件)-对象创建型模式

    1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...

  8. Factory Method(工厂方法)-对象创建型模式

    1.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 2.动机 框架使用抽象类定义和维护对象之间的关系.这些对象的创建通常也由框架 ...

  9. 【设计模式】observer(观察者)-- 对象行为型模式5.7

    1.意图 对象之间一对多的依赖关系,当目标对象发生改变时,所有依赖于它的对象都要得到通知并自动更新 2.别名 依赖,发布-订阅 3.动机 1)需要确保相互协作的对象的一致性(数据要保持一致),但一致性 ...

随机推荐

  1. http://www.cnblogs.com/nullcnb/p/3653262.html

    alert(hasPrototypeProperty(person,"name")); //false 来自原型 person1.name="mywei"; a ...

  2. Firefox 插件 FlashGot 创建 Axel 下载任务

    运行脚本: #!/bin/sh# FlashGot Command line arguments template: [URL] [COMMENT] [FOLDER]if [ $# = 3 ]; th ...

  3. AX7: HOW TO USE CLASS EXTENSION METHODS

    AX7: HOW TO USE CLASS EXTENSION METHODS   To create new methods on a standard AX class without custo ...

  4. 实时监听输入框值变化:oninput & onpropertychange

    结合 HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化. oninput 是 HTML5 的标准事件,对于检测 textarea, i ...

  5. SVN外链

    1 外链使用场景 使用Subversion进行版本管理时,有时需要将一些公共库或者开源库链接到自己项目中,为了同时做到与外部库实时更新,使用Subversion的外链功能,从而将外部的库当做本地项目的 ...

  6. 在MFC中,使用控制台Console输出调试信息

    1.在MFC的应用类的InitInstance()函数里添加: AllocConsole(); 有时候需要调整这行代码在InitInstance函数的位置 2.继续添加以下代码 freopen(&qu ...

  7. centos 6.5 x64创建并挂载使用iscsi共享磁盘

    前景摘要:NFS或iSCSI,哪个更好?文件 vs 块NFS使用文件级别的实施,服务器或存储阵列托管整个文件系统,客户到文件系统上读写文件,可以在阵列端对主存储数据进行重复数据删除.iSCSI和FC则 ...

  8. Nginx 遇到的问题

    1.样式没有出来 原因:在Nginx配置中没设置好地址 解决办法:重新设置,如下 #静态资源缓存设置 location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$ { ex ...

  9. win10环境下ue4使用游戏手柄输入

    忙里偷闲,趁着源码编译需要好久的时间,把这篇博客补上,来说说怎么在win10环境中,ue4使用游戏手柄输入,也就是gamepad输入. 1.我用的手柄是rapoo v10 这款手柄,连接无线USB之后 ...

  10. 25. vm安装redhat步骤

    详见:http://jingyan.baidu.com/article/49ad8bce532c525834d8fa19.html