C++设计模式-职责链模式
目录
基本概念
代码与实例
在哪种地方使用
基本概念
职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连接成一条链,并沿着这条链条传递该请求,直到有一个对象处理它为止。
这里发出这个请求的客户端并不知道这当中的哪个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态的重新组织和分配责任。
结构图如下(此图来源于大话设计模式)
职责链的好处:当客户提交一个请求时,请求是沿着链传递直至有一个ConcreteHandler对象负责处理它。随时的增加或修改处理一个请求的结构。增强了对象指派职责的灵活性。一个请求极可能导论链的末端都得不到处理,或者因为没有正确配置而得不到处理。
代码与实例
程序运行截图如下:
Head.h
#ifndef HEAD_H
#define HEAD_H#include <iostream>
#include <string>
using namespace std;//Handler类,定义一个处理请示的接口
class Handler{public:void setSuccessor(Handler *successor);virtual void handleRequest(int request);virtual ~Handler();protected:Handler();Handler(Handler &handler);Handler &operator = (Handler &h);Handler *m_successor;
};/*
ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求就处理之,
否则就将该请求转发给它的后继者。
*///ConcreteHandler1,当请求数在0到10之间则有权利处理,否则转到下一位。
class ConcreteHandler1 : public Handler{public:void handleRequest(int request);~ConcreteHandler1();
};//ConcreteHandler2,当请求数在10到20之间则有权处理,否则转移到下一位
class ConcreteHandler2: public Handler{public:void handleRequest(int request);~ConcreteHandler2();
};//COncreteHandle3,当请求数在20到30之间则有权处理,否则转移到下一位
class ConcreteHandler3: public Handler{public:void handleRequest(int request);~ConcreteHandler3();
};#endif // !HEAD_H
Head.cpp
#include "Head.h"
#include <assert.h>void Handler::setSuccessor(Handler *successor)
{m_successor = successor;
}void Handler::handleRequest(int request)
{}Handler::~Handler()
{cout << "Handle::~Handle()" << endl;
}Handler::Handler()
{m_successor = nullptr;
}Handler::Handler(Handler &handler)
{m_successor = nullptr;
}Handler & Handler::operator=(Handler &h)
{m_successor = nullptr;return Handler();
}void ConcreteHandler1::handleRequest(int request)
{if(request >= 0 && request < 10){cout << "ConcreteHandler1 处理这个消息" << endl;}else if(m_successor != nullptr){m_successor->handleRequest(request);}else{assert(!"雅喵蝶");}
}ConcreteHandler1::~ConcreteHandler1()
{cout << "ConcreteHandler1::~ConcreteHandler1()" << endl;
}void ConcreteHandler2::handleRequest(int request)
{if(request >= 10 && request < 20){cout << "ConcreteHandler2 处理这个消息" << endl;}else if(m_successor != nullptr){m_successor->handleRequest(request);}else{assert(!"雅喵蝶");}
}ConcreteHandler2::~ConcreteHandler2()
{cout << "ConcreteHandler2::~ConcreteHandler2()" << endl;
}void ConcreteHandler3::handleRequest(int request)
{if(request >= 20 && request < 30){cout << "ConcreteHandler3 处理这个消息" << endl;}else if(m_successor != nullptr){m_successor->handleRequest(request);}else{assert(!"雅喵蝶");}
}ConcreteHandler3::~ConcreteHandler3()
{cout << "ConcreteHandler3::~ConcreteHandler3()" << endl;
}
main.cpp
#include "Head.h"int main(int *argc, int *argv[]){Handler *h1 = new ConcreteHandler1;Handler *h2 = new ConcreteHandler2;Handler *h3 = new ConcreteHandler3;h1->setSuccessor(h2);h2->setSuccessor(h3);int requests[] = {5, 9, 12, 14, 16, 21, 27, 2};//int requests[] = {5, 9, 12, 14, 16, 21, 27, 2, 31};for(int i = 0; i < sizeof(requests) / sizeof(requests[0]); i++){h1->handleRequest(requests[i]);}delete h1;delete h2;delete h3;getchar();return 0;
}
在哪种地方使用
转眼间工作18个月了(加实习),在这18个月的时间,真的是学到了很多东西。下面是本人18个月的工作经验,对这种设计模式应该可以在哪种地方使用!!
本人认为,可以在2种地方使用!
一种是udp服务器,和某服务器内部采用,举个栗子!!!
第一种udp服务器:
当接收到数据包后,马上解析,这里使用职责链模式,解析后给对应的handlder,然后对应的handler发送消息给对应的消息队列(这里举个例子,使用消息总线,比如RabbitMQ),然后各个处理进程监听自己的队列,这样就可以很好的实现大数据处理和解耦合了!!!!
第二种是某服务器内部:
比如某个会员,他可以花钱提升为V1,V2,V3,V4。当用户冲钱提升后,先看他有没有上级,如果有上级,并且提示的等级在他上级之下,就把消息发送给某上级进程(这里同样可以采用RabbitMQ),当发现等级提示到他上级以上后,就发送给他上级的上级的队列,最后等级直接发送给管理员,然后给指定的队列。然后这样处理,耦合性也处理了!!!
C++设计模式-职责链模式相关推荐
- Python设计模式-职责链模式
Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...
- 第二十章 Caché 设计模式 职责链模式
文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
- PHP设计模式——职责链模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对 ...
- 设计模式|职责链模式--流程状态审批(枚举实现)
流程审批 在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(Activiti,Zeebe)的介绍,只是介绍职责链模式的设计模式,因 ...
- C++设计模式——职责链模式(responsibility chain pattern)
一.原理讲解 1.1意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2应用场景 有多个对象可以处 ...
- 设计模式---职责链模式(Chain of Responsibility Pattern)
目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...
- 设计模式-职责链模式
1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止. 相信大家都写过if...else或者swit ...
- 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理
文章目录 案例:企业信息处理 职责链模式 总结 完整代码与文档 案例:企业信息处理 对于一个企业来说,每天难免的要收到大量的信息,有求职者发送过来的简历.其他公司的商务合作信息.又或者是和一些企业或客 ...
最新文章
- kafka中生产者是如何把消息投递到哪个分区的?消费者又是怎么选择分区的?...
- One or more breakpoints cannot be set and have been disabled
- 如何用Java代码在SAP Marketing Cloud里创建contact数据
- 从飞机上看下雨是这样子,太震撼了!
- Fix an “Unapproved Caller” SecurityAgent Message in Mac OS X
- ros自带package在哪里_ROS Kinetic中自带的OpenCV使用
- OJ1081: n个数求和 (多实例测试)(C语言数组实现)
- 要掌握真正的免杀必须懂汇编---【汇编语言超浓缩教程】(转)
- java informix 实例
- 7个等级 容灾等级_在餐厅吃饭竟是7级风险!最新社交风险等级出炉!
- Raki的读paper小记:DEBERTA: DECODING-ENHANCED BERT WITH DISENTANGLED ATTENTION
- junit测试mysql_使用Junit单元测试及操作MySQL数据库时出现错误及解决方法
- WinDbg蓝屏分析入门
- 如何用自己的电脑开WiFi热点
- 接连倒闭失联的背后 传统健身房生意为什么突然就不行了?
- 超详细图文保姆级教程:App开发新手入门(一)
- 怎么关闭服务器管理器自动启动,用 systemctl 管理服务:查看状态、启动/停止服务、开启/取消开机自启动...
- Word模板生成C#源码
- Xilinx 黑金ZYNQ开发板AX7020,利用VIVADO进行FPGA程序烧录
- python 查看处理器架构