(六)责任链模式-C++实现
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
责任链模式是使用多个对象处理用户请求的成熟模式,它的关键是将这处理对象组成一个链。每个对象含有后继对象的引用,如果不能处理目前的请求就把它传给后继对象处理。
该模式中有两种角色:
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++实现的更多相关文章
- C#设计模式-责任链模式
在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在面试的 ...
- 读书笔记之 - javascript 设计模式 - 责任链模式
责任链模式可以用来消除请求的发送者和接收者之间的耦合.这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的.链中的每个对象可以处理请求,也可以将其传给下一个对象. 责任链的结构: 责任链由多个 ...
- 责任链模式Scala的7种实现
责任链模式是经典的GoF 23种设计模式之一,也许你已经了解这种模式.不管你是否熟悉,建议读者在阅读本文之前,不妨先思考下面三个问题: (1) 如何用多种风格迥异的编程范式来实现责任链模式? (2) ...
- Java内功修炼系列一责任链模式
在上一节的拦截器中提到,程序的设计者一般会用拦截器替替代动态代理,将动态代理的逻辑隐藏起来,而把拦截器接口提供给开发者,使开发者不需要关系动态代理的具体实现过程,但是有时候需要多个拦截器,而且拦截器之 ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- 23种设计模式--责任链模式-Chain of Responsibility Pattern
一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...
- ResponsibleChain(责任链模式)
/** * 责任链模式 * @author TMAC-J * 老板讲任务交给CTO,CTO自然不会亲自去做,又把人物分配给项目经理,项目经理再把任务分配给组长,组长再分配给个人 * 如果中途哪个环节出 ...
- 责任链模式/chain of responsibility/行为型模式
职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...
- 设计模式C#实现(十四)——责任链模式
意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...
随机推荐
- Charted – 自动化的可视化数据生成工具
Charted 是一个让数据自动生成可视化图表的工具.只需要提供一个数据文件的链接,它就能返回一个美丽的,可共享的图表.Charted 不会存储任何数据.它只是获取和让链接提供的数据可视化. 在线演示 ...
- Winjs – 微软开源技术发布的 JavaScript 组件集
Winjs 是由微软开源技术的开发者推出的一组 JavaScript 组件,包括 ListView.ListView.Tooltip.DatePicker.Ratings 等等,帮助 Web 开发人员 ...
- [deviceone开发]-模仿Zaker的示例
一.简介 这个示例模仿zaker这个App,主要的界面基本都完成,用到了各种deviceone提供的ui组件,比如GridView,ListView,ScrollView,ViewShower等等.初 ...
- 微信小程序之后台https域名绑定以及免费的https证书申请
微信小程序在11月3号发布了,这是一个全新的生态,没有赶上微信公众号红利的开发者,运营者可别错过这趟车了. 但是微信的后台需要全https,之前我还不相信,后台注册了后进后台才发现,服务器配置如下图 ...
- Android实现与PHP服务器的交互
今天算是有点小激动呢!拿到Android与PHP这个课题已经两个星期了,直到今天才算是有了一点点小收获. 虽然还是没能成功上传到服务器,不过已经看到了曙光,已经实现了一半了,那就是已经连接到了服务器. ...
- 操作系统开发系列—12.f.在内核中添加中断处理 ●
因为CPU只有一个,同一时刻要么是客户进程在运行,要么是操作系统在运行,如果实现进程,需要一种控制权转换机制,这种机制便是中断. 要做的工作有两项:设置8259A和建立IDT. /*========= ...
- 【C语言】C语言数据类型
目录: [数据类型图] [基本数据类型] · 整型 · 实型 · 字符型 · 布尔类型 1.数据类型图 2.基本数据类型 · 整型 用于准确表示整数,根据表示范围的不同分为三种:短整型 ...
- mac(linux) 上如何安装ant
1.从http://ant.apache.org/srcdownload.cgi下载ant (用ant src编译后装) 2.解压下载下来的内容到一个文件夹,打开终端先进入到刚才解压后的文件夹如:cd ...
- 1.7 基础知识——GP2.6 配置管理(CM)
摘要: 某某工作产品要进行配置管理,并不意味非要进行很重型的配置管理,根据实际需要采取合适的方式就可以了. 正文: GP2.6 Place designed work products of XXX ...
- nexus搭建maven私服
下载nexus 首先,从以下地址下载nexus: http://www.sonatype.com/download-oss-sonatype 选择下载nexus-2.13.0-01-bundle.ta ...