灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:7670回复:0

[C++技术]C++的一种业务分发方案(另类的工厂模式)

楼主#
更多 发布于:2014-07-13 17:02

在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]


喜欢0 评分0
游客

返回顶部