在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. Eclipse中Next Difference的快捷键

    原文:http://stackoverflow.com/questions/10177460/is-there-a-key-binding-for-next-difference-and-previo ...

  2. leetcode398

    public class Solution { int[] nums; Random rnd; public Solution(int[] nums) { this.nums = nums; this ...

  3. DAY7-面向对象之封装

    一.引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有alex一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装=‘隐藏’,这种理解是相当片面的 二.先看如何隐藏 在 ...

  4. UAC(User Agent Client) 和 UAS(User Agent Server)

    SIP协议采用Client/Server模型.每一个请求(Request)触发服务器的一个操作:每个操作被称为方法(Method):每个请求除了指明具体方法外,还携带了一系列的头域(Header fi ...

  5. 使用Java读取JSON数据

    ----------------siwuxie095                         JSON 官网:http://www.json.org/     在官网页面的下方,是 JSON ...

  6. 基于unity3d的RRT算法路径规划

  7. iOS 本地加载js文件

    #import "RootViewController.h" @interface RootViewController ()<UIWebViewDelegate> @ ...

  8. WordCount 优化版测试小程序实现

    Stage1:代码编写+单元测试 Github地址: https://github.com/245553473/wcPro.git PSP表格: PSP PSP阶段 预估耗时(分钟) 实际耗时(分钟) ...

  9. 类的继承与super()的意义以即如何写一个正确的异常类

    这些东西都是我看了许多名师课程和自己研究的成果,严禁转载,这里指出了如何正确的自己定义一个异常类并看一看sun写的java的源代码话题一:子类的构造器执行是否一定会伴随着父类的构造执行? 1.this ...

  10. WebAPI 请求跨域问题

    本人采用的是利用CORS解决跨越问题. 首先利用Nuget 安装“microsoft.aspnet.webapi.cors”,如下图所示: 紧接着,在WebApiConfig文件中加入 config. ...