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

责任链模式是使用多个对象处理用户请求的成熟模式,它的关键是将这处理对象组成一个链。每个对象含有后继对象的引用,如果不能处理目前的请求就把它传给后继对象处理。

该模式中有两种角色:

1、处理者:是一个接口或者抽象类,规定了具体处理者处理用户请求的方法,还有设置后继对象的方法

2、具体处理者:是具体的处理者的实现。

本例子中,是一个查询用户身份证号码的例子,不同的具体处理者代表不同的城市,然后对一个身份证号码的请求进行处理。有三个文件,Handler.h和Handler.cpp以及测试用的ResponsibilityChainTest.cpp

(1)Handler.h

 #ifndef _HANDLER_H_
#define _HANDLER_H_
#include <iostream>
#include <list>
#include <string>
using namespace std; /*
责任链模式
有很多的对象可以处理请求,
但是用户并不感知是那个对象处理了他的请求。
*/ //抽象类
class Handler{
public:
virtual void handleRequest(string number) = ;
virtual void setNextHandler(Handler* handler) = ;
}; //具体处理者1
class Beijing : public Handler{
public:
Beijing();
void handleRequest(string number) override;
void setNextHandler(Handler* handler) override; private:
Handler *myHandler;
list<string> numberList;
}; //具体处理者2
class Shanghai : public Handler{
public:
Shanghai();
void handleRequest(string number) override;
void setNextHandler(Handler* handler) override; private:
Handler *myHandler;
list<string> numberList;
}; //具体处理者3
class Tianjin : public Handler{
public:
Tianjin();
void handleRequest(string number) override;
void setNextHandler(Handler* handler) override; private:
Handler *myHandler;
list<string> numberList;
}; #endif

(2)Handler.cpp

 #include "Handler.h"

 Beijing::Beijing()
{
numberList.push_back("");
numberList.push_back("");
numberList.push_back("");
numberList.push_back("");
} void Beijing::handleRequest(string number)
{
list<string>::iterator it;
it = find(numberList.begin(), numberList.end(), number);
if (it != numberList.end())//存在
{
cout << "该人在北京居住" << endl;
}
else{
cout << "该人不在北京居住" << endl;
if (NULL != myHandler)
{
myHandler->handleRequest(number);
}
}
} void Beijing::setNextHandler(Handler* handler)
{
myHandler = handler;
} Shanghai::Shanghai()
{
numberList.push_back("");
numberList.push_back("");
numberList.push_back("");
numberList.push_back("");
} void Shanghai::handleRequest(string number)
{
list<string>::iterator it;
it = find(numberList.begin(), numberList.end(), number);
if (it != numberList.end())//存在
{
cout << "该人在上海居住" << endl;
}
else{
cout << "该人不在上海居住" << endl;
if (NULL != myHandler)
{
myHandler->handleRequest(number);
}
}
} void Shanghai::setNextHandler(Handler* handler)
{
myHandler = handler;
} Tianjin::Tianjin()
{
numberList.push_back("");
numberList.push_back("");
numberList.push_back("");
numberList.push_back("");
} void Tianjin::handleRequest(string number)
{
list<string>::iterator it;
it = find(numberList.begin(), numberList.end(), number);
if (it != numberList.end())//存在
{
cout << "该人在天津居住" << endl;
}
else{
cout << "该人不在天津居住" << endl;
if (NULL != myHandler)
{
myHandler->handleRequest(number);
}
}
} void Tianjin::setNextHandler(Handler* handler)
{
myHandler = handler;
}

(3)ResponsibilityChainTest.cpp

 #include "Handler.h"

 int main()
{
//创建责任链
//一般将责任大(最有可能处理用户请求)的对象放在前面
Handler *beijing = new Beijing();
Handler *tianjin = new Tianjin();
Handler *shanghai = new Shanghai(); beijing->setNextHandler(tianjin);
tianjin->setNextHandler(shanghai); //用户进行请求
//从责任链的第一个对象开始
beijing->handleRequest(""); return ;
}

责任链的优势:

1、责任链中对象只和自己的后继是耦合关系,和其他对象毫无关联

2、在处理中分配职责时,责任链给程序更多的灵活性(将责任大的对象放在责任链的前面)

3、应用程序可以动态增加或者删除处理者;也可以动态的改变处理者之间的先后顺序

4、使用责任链的用户不必知道处理者的信息。

适合责任链的场景:

1、有很多对象可以处理用户的请求,希望程序在运行时自动确定处理用户请求的那个对象。

2、程序希望动态定制可处理用户请求的对象集合。

(六)责任链模式-C++实现的更多相关文章

  1. C#设计模式-责任链模式

    在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在面试的 ...

  2. 读书笔记之 - javascript 设计模式 - 责任链模式

    责任链模式可以用来消除请求的发送者和接收者之间的耦合.这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的.链中的每个对象可以处理请求,也可以将其传给下一个对象. 责任链的结构: 责任链由多个 ...

  3. 责任链模式Scala的7种实现

    责任链模式是经典的GoF 23种设计模式之一,也许你已经了解这种模式.不管你是否熟悉,建议读者在阅读本文之前,不妨先思考下面三个问题: (1) 如何用多种风格迥异的编程范式来实现责任链模式? (2) ...

  4. Java内功修炼系列一责任链模式

    在上一节的拦截器中提到,程序的设计者一般会用拦截器替替代动态代理,将动态代理的逻辑隐藏起来,而把拦截器接口提供给开发者,使开发者不需要关系动态代理的具体实现过程,但是有时候需要多个拦截器,而且拦截器之 ...

  5. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  6. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

  7. ResponsibleChain(责任链模式)

    /** * 责任链模式 * @author TMAC-J * 老板讲任务交给CTO,CTO自然不会亲自去做,又把人物分配给项目经理,项目经理再把任务分配给组长,组长再分配给个人 * 如果中途哪个环节出 ...

  8. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

  9. 设计模式C#实现(十四)——责任链模式

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...

随机推荐

  1. 2015年免费的25款 WordPress 网站模板

    2015年 WordPress 插件和主题的数量继续在增长.这一年,我们可以期待WP主题引入一些新的技术,从背景,自适应响应式图像到从背景图片中提取主色. 本文包含25款最近发布的 WordPress ...

  2. IOS 局域网发送信息

    基于ios 例子WiTap 1.创建本地的服务并设置监听时间检测是否有设备连接. NSNetService * server = [[NSNetService alloc] initWithDomai ...

  3. pqgrid对json数据的绑定

    $(function () { var data = [[1, 'Exxon Mobil', '339,938.0', '36,130.0'], [2, 'Wal-Mart Stores', '315 ...

  4. Maven发布工程到公共库

    1.发布工程 新建一个 Maven build 选择要发布的工程

  5. Html技巧 语义化你的代码

    首先是关于语义(Semantics)和默认样式的区别,默认样式是浏览器设定的一些常用tag的表现形式,语义化的主要目的就是让大家直观的认识标签(markup)和属性(attribute)的用途和作用. ...

  6. 将数据导入PostGIS

    #!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess # database options db_schema = " ...

  7. 计算c字符的长度,保证不超过2^30

    来自sqlite3源码 /* ** Compute a string length that is limited to what can be stored in ** lower 30 bits ...

  8. xcode7无证书真机调试 Error: An App ID with identifier "*" is not avaliable. Please enter a different string.

    1. Error: An App ID with identifier "*" is not avaliable. Please enter a different string. ...

  9. OC中的Block的那些事

    Block封装了一段代码,可以在任何时候执行 Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值. 苹果官方建议尽量多用block.在多线程.异步任务.集合遍历.集合排序.动 ...

  10. 【Android】友盟的自动更新组件

    前言 又好又专业的服务能帮开发者省很多时间.一开始做项目也准备自己来统计数据.自己做自动更新,随着使用友盟服务的时间增加,渐渐放弃了这种想法,转而研究如何更充分的使用,这里分享一下使用自动更新组件的心 ...