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

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

该模式中有两种角色:

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. Ubuntu Desktop 15.10 自带桌面共享问题修复

    Ubuntu 15.10 (似乎从14.04开始) 的小坑,使用自带远程桌面连接出错,弄得我很不爽,偶尔从 youtube 上看到一视频,解决了.聊以记之. 顺便说一下,这个自带的桌面共享的名字是:v ...

  2. 请使用java来构造和遍历二叉树?

    [分析] 二叉树的结构:根节点.左子树.右子树.其中左子树的值必须小于根节点,右子树的值必须大于根节点.构造这种树结构,就是创建一个类,并提供一个方法,当给定一个值时,它能够自动创建节点并自动挂到二叉 ...

  3. Git正确的协作方式(很简单)

    最近部门有人书写了一篇很好的Git协作方式,操作也简单,分支能以保持一条干净的线进行协作开发.这里做个笔记,方便之后查看. PS:本文非原创. 原则 不过分相信自己,自己的修改,可能影响所有人 不过分 ...

  4. Client JQuery invoke NetSuite Suitelet

    Please indicate the source if you need to repost. Client jQuery could initialize a cross-domain requ ...

  5. Autodesk View and Data API练练手

    大家如果参加过我们的活动,你应该已经听过看过不少关于View and Data Web Service的例子里,如果还没有的话,请看看下面这几篇: http://www.cnblogs.com/jun ...

  6. Android闹钟 AlarmManager的使用

    Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹 ...

  7. AS下NDK开发(一)

    捣鼓了一天的NDK,总结下. Eclipse下开发ndk好像挺麻烦的样子,看书上要下载Cygwin,eclipse还要下载插件CDT..而在AS上就方便多啦.下载android ndk.安装,配置环境 ...

  8. 图解六大UML类图关系

    在学习UML类图的过程中,UML类图关系是必须要掌握的问题,UML定义的关系主要有六种:依赖.类属.关联.实现.聚合和组合.下面对其定义和表示方法逐一说明. UML类图关系简介 依赖(Dependen ...

  9. CoreGraphics相关方法

    // 将view转为image(不经常用到的功能)(摘自SCCatWaitingHUD) - (UIImage *)convertViewToImage { CGSize s = self.bound ...

  10. Github上十大C#开源项目排行榜

    1.SignalR ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.当WebSockets可用时(即浏览器支持Ht ...