使用小技巧使子功能模块不污染主框架
时间:2019-11-14
本文章向大家介绍使用小技巧使子功能模块不污染主框架,主要包括使用小技巧使子功能模块不污染主框架使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用C++开发在做消息分发的时候我们经常会遇到这样的场景,我们为每个消息设计了单独的处理类或者处理函数,并用一个映射去维护这样的对应关系,当消息来的时候,我们遍历这个映射表,找到对应的处理函数,进而处理消息。
我们可能遇到了这样的设计
#include"case1.h" #include"case2.h" #include"case3.h" #include"case4.h" #include"case5.h" void HandleManage::reghandle(){ _mhandles["cmd_1"] = new case1_handle(); _mhandles["cmd_2"] = new case2_handle(); _mhandles["cmd_3"] = new case3_handle(); _mhandles["cmd_4"] = new case4_handle(); _mhandles["cmd_5"] = new case5_handle(); }
这样设计满足了我们的要求,但是会带来两个问题
1、随着迭代开发的进行,会有大量新的case进来,这样regHandle会变得非常长,而且同时会有大量的case已经不再有用,占用了映射表的同时也降低了消息映射的查找效率
2、当我们不想使用旧的case的时候,注册模块需要手动删除,维护起来比较困难
为了解决这两个问题我打算重新设计handle管理模块:
HandleManage.h
#pragma once #include <map> #include <string> #include "IHandle.h" using namespace std; class HandleManager { public: static HandleManager* instance() { if (_pInstance == NULL) { _pInstance = new HandleManager(); } return _pInstance; } void regHandle(const string& cmd, IHandle* handle); void unregHandle(const string& cmd); IHandle * getHandle(const string& cmd); void onHandle(const string& cmd); private: map<string, IHandle*> _map_handle; HandleManager(){} static HandleManager* _pInstance; };
HandleManage.cpp
#include "HandleManager.h" HandleManager* HandleManager::_pInstance = NULL; void HandleManager::regHandle(const string& cmd, IHandle* handle) { _map_handle[cmd] = handle; } void HandleManager::unregHandle(const string& cmd) { if (_map_handle.find(cmd) != _map_handle.end()) { _map_handle.erase(cmd); } } IHandle * HandleManager::getHandle(const string& cmd) { if (_map_handle.find(cmd) != _map_handle.end()) { return _map_handle[cmd]; } return NULL; } void HandleManager::onHandle(const string& cmd) { IHandle * pHandle = getHandle(cmd); if (NULL != pHandle) { pHandle->handle(cmd); } }
IHandle.h 消息处理的统一接口
#pragma once #include<string> using namespace std; class IHandle { public: virtual void handle(const string& cmd) = 0; };
当我们每开发一个case的时候为期建立唯一的文件夹(f方便makefile添加编译路径)
以一个case为例:
case_1.h
#pragma once #include <string> #include "../manager/HandleManager.h" using namespace std; const static string strCmd = "case_1"; class Case_1:public IHandle,public IConfig { public: static Case_1* instance() { if (_pInstance == NULL) { _pInstance = new Case_1(); } if (_pInstance != NULL) { HandleManager::instance()->regHandle(strCmd, _pInstance); } return _pInstance; } void handle(const string& cmd); private: static Case_1* _pInstance; Case_1(){} }; static Case_1 * spInstance = Case_1::instance();
case_1.cpp
#include "Case_1.h" #include <iostream> Case_1* Case_1::_pInstance = NULL; void Case_1::handle(const string& cmd) { cout <<"handle:"<< cmd << endl; }
测试代码如下:
#include "test/manager/HandleManager.h" using namespace std; int main(){ HandleManager::instance()->onHandle("case_1"); HandleManager::instance()->onHandle("case_2"); system("pause"); }
可以看到在测试入口和handleManager都没有关于具体case的任何代码,而是在每个case模块将处理函数注入到消息映射表中,同时利用外部变量的特性,在运行最开始时就能被调用
当有新的需求case合入或者旧的case过期的时候,我们只需修改Makefile就能保证最后的进程只包含有效的case代码
原文地址:https://www.cnblogs.com/wanzaixiaoxin/p/11862752.html
- 分布式监控系统Zabbix3.2添加自动发现磁盘IO并注册监控
- SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法
- 分布式监控系统Zabbix3.2对数据库的连接数预警
- 分布式监控系统Zabbix3.2监控数据库的连接数
- 分布式监控系统Zabbix3.2给异常添加邮件报警
- 分布式监控系统Zabbix3.2跳坑指南
- 一图看懂java内存模型
- 零代码如何打造自己的实时监控预警系统
- 一步一步在Windows中使用MyCat负载均衡 上篇
- 你真的会玩SQL吗?之逻辑查询处理阶段
- javascript中如何正确将日期(Date)字符串转换为日期(Date)对象?
- 全面迎接.Net3.0时代的到来(WCF/WF/WPF/LINQ)
- SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易
- [基础]datagridview绑定数据源的几种常见方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法