Chain Of Responsibility(职责连)-对象行为型模式
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(职责连)-对象行为型模式的更多相关文章
- 设计模式19:Chain Of Responsibility 职责链模式(行为型模式)
Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请 ...
- 设计模式(3)-对象创建型模式-Abstract Factory模式
1.对象创建型模式 1.3 Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: • 一个系统要独立于它的产品的创建. ...
- 设计模式(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) - ...
- C#设计模式之二十一职责链模式(Chain of Responsibility Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中 ...
- C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例子吧,理解起来可能更 ...
- 设计模式学习笔记——Chain of Responsibility职责链模式
重点在链.一条链,如果本节点处理不了,则传递给下一个节点处理. 关键是如何传给下一个节点? 主要是由本节点决定传给哪一个节点. public class Client { public static ...
- singleton(单件)-对象创建型模式
1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...
- Factory Method(工厂方法)-对象创建型模式
1.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 2.动机 框架使用抽象类定义和维护对象之间的关系.这些对象的创建通常也由框架 ...
- 【设计模式】observer(观察者)-- 对象行为型模式5.7
1.意图 对象之间一对多的依赖关系,当目标对象发生改变时,所有依赖于它的对象都要得到通知并自动更新 2.别名 依赖,发布-订阅 3.动机 1)需要确保相互协作的对象的一致性(数据要保持一致),但一致性 ...
随机推荐
- 如何解決 Homebrew Update 失敗?
相信許多用 MAC 系統的程式設計師.工程師們都有用 Homebrew 這個超好用的 Open Source 套件管理程式吧? 如果沒有的話,你可以透過以下的指令安裝: ruby -e "$ ...
- 在VS中添加lib的简单方法
1.工程---属性---配置属性---VC++ Directories---General---Include Directories:加上头文件存放目录 2.VC中,切换到"解决方案视图& ...
- Java基础知识:代理
一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会动态代理技术,那么在学习Spring这些框架时是学不明白的. 动态代理技术就是用来产生一个对象的代理对 ...
- unity自定义菜单面板开发
using UnityEditor;using UnityEngine;using CreateTerrainDLL; public class CreateTerrainMenu : EditorW ...
- C# CRC-CCITT (Kermit)校验方法
using System; public enum Crc16Mode : ushort { Standard = 0xA001, CcittKermit = 0x8408 } public clas ...
- 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路
今天代码写着写着就莫名闪退了,手机也没有“程序停止运行”的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现.复现几次之后,终于从logcat中看到了一行可疑的log: A ...
- CSS常用样式及示例
CSS常用样式及示例 一.简介 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集) ...
- ajax options
非同一域名的ajax post请求,浏览器会自动发送http options的请求检查是否允许跨域访问
- 关于Hibernate XXX is not mapped 错误
我的实体类是这么配置的 @Entity(name="EntityName") //必须,name为可选,对应数据库中一的个表 就会出现 XXX is not mapped. ...
- 安装spf13-vim on Windows10
安装之前 1.系统为 windows10 Version 1607 64位 企业版 2.参考 http://www.codeweblog.com/gvim-64%E4%BD%8D-windows-7 ...