在C++中,传统的业务分发,总要写一大串的switch-case,而且每次增加新业务时,都要在原有的switch-case里加一个分支,这就违反了设计模式中的开放封闭原则,
以下这种方案,就完全去除了switch-case,每当要添加业务模块时,只要写一个TEST_MODULE(index, name)就可以了。
思路很简单,直接上代码:
[code ]#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;
}</int,></int,></map></string></iostream>[/code]