在C++中,传统的业务分发。总要写一大串的switch-case,并且每次添加新业务时。都要在原有的switch-case里加一个分支,这就违反了设计模式中的开放封闭原则。
下面这样的方案,就全然去除了switch-case。每当要加入业务模块时。仅仅要写一个TEST_MODULE(index, name)就能够了。
思路非常easy,直接上代码:
#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;
}