在C++中,传统的业务分发,总要写一大串的switch-case,而且每次增加新业务时,都要在原有的switch-case里加一个分支,这就违反了设计模式中的开放封闭原则,
以下这种方案,就完全去除了switch-case,每当要添加业务模块时,只要写一个TEST_MODULE(index, name)就可以了。#include <iostream> #include <string> #include <map> using namespace std; //业务模块,第一个参数是模块ID,第二个是模块名称 //用了C语言的一些技巧,嘿嘿 #define TEST_MODULE(index, name) void test_##name(int num); TempFunction fun_##name(index, test_##name); void test_##name(int num) //模块中所使用的回调函数 typedef void (*MODULE_FUNCTION)(int num); //模块管理类(单例) class ModuleFactory { private: map<int, MODULE_FUNCTION> m_ModuleMap; ModuleFactory() { } ~ModuleFactory() { } public: static ModuleFactory *GetInstance() { static ModuleFactory instance; return &instance; } //返回总的业务个数 int BusinessCount() { return m_ModuleMap.size(); } //加载业务(如果业务号有重复,就输出一条信息,然后退出程序) void AddBusiness(int index, MODULE_FUNCTION fun) { m_ModuleMap[index] = fun; } //执行业务 void RunFunction(int index, int num) { map<int, MODULE_FUNCTION>::iterator iter = m_ModuleMap.find(index); if( iter == m_ModuleMap.end() ) cout << "no this module: " << index << endl; else iter->second(num); } }; //临时类,利用了“全局变量的构造函数必定会会在main函数之前被执行这个特点 class TempFunction { public: TempFunction(int index, MODULE_FUNCTION fun) { ModuleFactory::GetInstance()->AddBusiness(index, fun); } }; //三个业务模块 //每当要添加业务模块时,只要写一个TEST_MODULE(index, name)就可以了 TEST_MODULE(1, aaa) { cout << "aaa: " << num << endl; } TEST_MODULE(2, bbb) { cout << "bbb: " << num << endl; } TEST_MODULE(3, ccc) { cout << "ccc: " << num << endl; } //测试例子 int main() { int index, num; while( cin >> index >> num ) { ModuleFactory::GetInstance()->RunFunction(index, num); } return 0; }
C++的一种业务分发方案(另类的工厂模式),布布扣,bubuko.com
原文地址:http://blog.csdn.net/small_qch/article/details/37693829