(六)责任链模式-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 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...
随机推荐
- [js开源组件开发]模拟下拉选项框select
模拟下拉选项框select 在css3流行的情况下,下拉框还是无法满足PD的需求,所以有了autosearch,有了模拟下拉框.效果如下图: select DEMO请案例点击这里查看.http://w ...
- SharePoint 2013 初始化Ribbon选中Tab
SharePoint使用中,经常打开页面会有默认展开的Ribbon选项,有时这又不是我们需要的,所以我们就需要默认选中的项目,下面简单介绍下如何实现. 方法一 1.Dispform.aspx页面默认R ...
- [ javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中 ] javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中方法演示 效果之三
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- 之一:CABasicAnimation - 基本动画
嗷呜嗷呜嗷呜 // 将视图作为属性方便后面执行多个不同动画 _myView = [[UIView alloc] init]; _myView.layer.position = CGPointMake( ...
- This version of android studio is incompatible with the gradle version used.Try disabling the instant run解决办法
今天打开android studio又碰到一个奇怪的问题:This version of android studio is incompatible with the gradle version ...
- App Transport Security has blocked a cleartext
错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...
- Xcode快捷键大全
转载地址http://www.360doc.com/content/12/0521/09/6541311_212458595.shtml.
- git一些常用的操作(转载)
译者序:这是一篇给像我这样的新手或者是熟悉图形工具的老鸟看的.仅作为快速入门的教程. git 现在的火爆程度非同一般,它被广泛地用在大型开源项目,团队开发,以及独立开发者,甚至学生之中. 初学者非常容 ...
- Struts
Struts是基于MVC的框架,它进一步的对MVC进行了封装. MVC 概念 MVC全名是Model View Controller,是模型(model)—视图(view)—控制器(controlle ...
- C文件编译、链接指令
通过mac终端 输入指令: cc -c 文件名.c 可以把C文件编译成.o文件(其实是2进制文件) 然后通过指令 cc 文件名.o 把.o文件链接C文件所需要的C语言的底层库,成为可以直接运行的lin ...