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


    在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;
    }


  • 相关阅读:
    shell命令编程小例
    汇编输出0255ascii码(VGA下)
    linux程序时间控制小例
    Undefined exploded archive location 项目不能部署
    关于org.apache.jasper.JasperException: Unable to compile class for JSP问题的解决
    Some characters cannot be mapped using "GBK" character encoding 的解决办法
    如何处理Windows Forms程序中未处理的异常
    关于bos的edit页面的文件加载顺序
    关于unable to extend lob segment的问题解决方法
    从事ASP.NET开发两年多,谈谈对两三年工作经验的ASP.NET程序员的基本见解
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10795536.html
  • Copyright © 2020-2023  润新知