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

在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++的一种业务分发方案(另类的工厂模式),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。