(六)责任链模式-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 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...
随机推荐
- Koala – 开源的前端预处理器语言图形编译工具
koala 是一个前端预处理器语言图形编译工具,支持 Less.Sass.Compass.CoffeeScript,帮助 Web 开发者更高效地使用它们进行开发.跨平台运行,完美兼容 Windows. ...
- xwamp 目录结构设计
xwamp 目录结构设计原文来自:http://www.xwamp.com/make/directory-structure. 目录说明 所有程序都统一放在D盘下的xwamp目录. 目录列表 Apac ...
- 分享11个纯css完成的图片浏览器
图片画廊用于在网站上显示系列图片,它已成为网站重要的组成部分.实现图片画廊有很多种方法,今天要与大家分享的是11个使用纯 CSS 实现的图片画廊,它们代码少,效果炫,加载速度快,希望能对大家有所帮助. ...
- ie7下的javascript兼容
<a href="javascript:;" onclick="functionone();"></a> <script> ...
- CSS选择符详解
一.类型选择符 什么是类型选择符?指以网页中已有的标签类型作为名称的行径符.body是网页中的一个标签类型,div,p,span都是. 如下: body {} div {} p {} span {} ...
- javascript --- 事件冒泡与事件捕获
事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题.考虑下面这段代码,就不写html->head,body之类的代码了,自行 ...
- LeakCanary中英文文档+使用例子
Android 开源界最伟(jian)大(zhi)高(kai)效(gua)的公司 Square 又向业界投下一颗重磅炸弹.推出了一个叫 LeakCanary 的玩意儿,可以通过简单粗暴的方式来让开发者 ...
- Bootstrap分页插件--Bootstrap Paginator
开源中国有一篇介绍的很详细,链接:https://my.oschina.net/shunshun/blog/204587 使用这个插件和使用其他Bootstrap内置的插件一样,需要引入如下文件: & ...
- DB2常用sql命令
DB2 清除数据库序列缓存 alter sequence wfr.wfr_bill_histories_s nocache; 创建清空所有表数据脚本select 'alter table '||RT ...
- ionic教程之Win10环境下ionic+angular实现滑动菜单及列表
写博客,不容易,你们的评论和转载,就是我的动力,但请注明出处,隔壁老王的开发园:http://www.cnblogs.com/titibili/p/5124940.html 2016年1月11日 21 ...