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

C++的一种业务分发方案(另类的工厂模式)的更多相关文章

  1. 根据业务自己设计的.NET工厂模式架构

    最近项目的架构需要做调整优化,根据业务需要写了一个简单的工厂模式架构 项目介绍:整个系统分为三大平台(这里用A,B,C来标示),每个平台又细分为多个APP客户端(每个APP都有appid来区分) 因为 ...

  2. java23种设计模式(二)抽象工厂模式

    我们接着上一章的工厂方法模式继续学习一下抽象工厂模式. 抽象工厂模式:在工厂模式中,如果有多个产品,则就是抽象工厂模式. 例子: 有一个工厂开了两个子公司,专门用来生产电脑配件键盘和鼠标,一个是联想工 ...

  3. GOF业务场景的设计模式-----工厂模式

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 工厂方法模式 基本代码 interface IProduct { public void produ ...

  4. java三种工厂模式

    适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...

  5. atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc

    atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1 ...

  6. Python几种并发实现方案的性能比较

    http://blog.csdn.net/permike/article/details/54846831 Python几种并发实现方案的性能比较 2017-02-03 14:33 1541人阅读 评 ...

  7. 对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)

    前言 这是<Spring Cloud 进阶>专栏的第六篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得了? 阿里面 ...

  8. 正确修改MySQL最大连接数的三种好用方案

    以下的文章主要介绍的是正确修改MySQL最大连接数的三种好用方案,我们大家都知道MySQL数据库在安装完之后,默认的MySQL数据库,其最大连接数为100,一般流量稍微大一点的论坛或网站这个连接数是远 ...

  9. 最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)

    导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须 ...

随机推荐

  1. DDD学习笔录——简介领域驱动设计的实践与原则

    DDD在存在许多DDD模式的同时,也有大量实践和指导原则,这些都是DDD思想体系成功的关键. 1.专注于核心领域 DDD强调的是在核心子域付出最多努力的需要.核心子域是你的产品会成功还是会失败的差异化 ...

  2. 使用Eclipse中遇到的问题

    1.解决eclipse中jsp没有代码提示问题 原因是项目没有关联TOMCAT库文件: 右键项目—> 属性->JAVA Build Path -> Add Library->S ...

  3. re.match

  4. oracle DDL(create、alter、drop)

    一.创建表1.创建表CREATE TABLE <table_name>( column1 DATATYPE [NOT NULL] [PRIMARY KEY], column2 DATATY ...

  5. ElasticSearch入门一

    ElasticSearch入门一 1 安装ElasticSearch,配置环境变量,并且存在Java环境,而且是Java环境: 下图是安装的目录: 进入bin目录之后,请看bin目录: 启动elast ...

  6. GSON 报错HibernateProxy. Forgot to register a type adapter? 的解决办法

    使用Gson转换hibernate对象遇到一个问题,当对象的Lazy加载的,就会出现上面的错误.处理方式摘抄自网上,留存一份以后自己看. 网上找到的解决办法,首先自定义一个类继承TypeAdapter ...

  7. No bean class specified on bean definition 解决方案

    调试Spring项目出现No bean class specified on bean definition异常 但是控制台并没有给出其他相关信息了 这个时候可以在AbstractBeanDefini ...

  8. OpenNi安装示例

    1.下载OpenNi  https://structure.io/openni 解压,点击运行 选择安装目录,默认即可 安装过程中有弹框,选择 安装 点击 完成 在相应的安装目录下即可找到

  9. utf8转unicode

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h& ...

  10. php学习笔记-while循环

    while(condition) { func(); //break the loop } while循环的执行顺序是先判断condition是不是true,如果是true,那么就执行while循环体 ...