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. Django 浏览页面点击计数(通用视图)

    通常情况下在Views.py中直接写一个视图函数就可以了,由于每次点出详情时都会经视图函数处理, 所以可以在此视图函数中对浏览次数进行"+1" 操作. 对应的url:url(r'^ ...

  2. php utf-8字符转ascii字符

    function utf8_urldecode($str) { $str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\ ...

  3. How to Take Control of Your Line Height in Outlook.com

    Reference to: http://www.emailonacid.com/blog/details/C13/line_height_and_outlook.com

  4. Python-8 元组tuple

    #1 特殊的列表:元组 元组中的元素不可改变 #2 创建.访问 >>> tuple1=(1,2,3) >>> tuple1=1,2,3 >>> t ...

  5. Java 之ThreadLocal 对应C#之ThreadStatic

    java: public class JForumExecutionContext { private static ThreadLocal userData = new ThreadLocal(); ...

  6. MVC @Html.DropDownList()绑定值

    Controller中: ViewBag.modules = new SelectList(集合.ToList(), "下拉框键", "下拉框值"); View ...

  7. MVC KindEdit

    先将下载的KindEditor放到项目中 View页面 <!DOCTYPE html><html><head>    <meta name="vie ...

  8. NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)

    摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...

  9. Monkey基础

    一.Monkey工具简介 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序 ...

  10. mysql 忘记root 密码的解决方法

    LINUX 1.切换root 用户 2.停止mysqld 服务 /etc/inid.d mysqld stop 3.跳过验证登录 mysqld_safe --skip-grant-tables &am ...