在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. python metaclass(元类)

    metaclass(元类) 一.创建类的执行流程 二.元类的认识 什么是元类呢?在Python3中继承type的就是元类 二.元类的示例 方式一: # 方式一 class MyType(type): ...

  2. leetcode230

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  3. EF CODEFIRST WITH ORACLE 存储过程

    EF  CODEFIRST WITH ORACLE 解决存储过程一直没找到解决方案 所以最后也没办法还是用了最基本的解决方案 采用Oracle.ManagedDataAccess提供的ADO基础访问类 ...

  4. poj1753-Flip Game 【状态压缩+bfs】

    http://poj.org/problem?id=1753 Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  5. Flask框架 之 基本使用

    初识Flask Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求 ...

  6. Charles常见问题汇总

    Charles是一款很好用的抓包修改工具,但是如果你不是很熟悉这个工具的话,肯定会遇到各种感觉很莫名其妙的状况,这里就来帮你一一解答下面再说说charles的一些其他常用的功能. 选择请求后,右键可以 ...

  7. 解决Visiual Studio2012 CLR20r3问题

    解决办法: 步骤1:开始-->所有程序-->Microsoft Visual Studio 2012-->Visual Studio Tools-->VS2012 开发人员命令 ...

  8. ipmitool查询服务器功耗

    通过ipmitool查看服务器功耗 ipmitool -H $ip -I lanplus -U $user -P $password sdr elist | grep "Pwr Consum ...

  9. C/C++单向链表

    由于时间仓促,作者并没有进行任何的检查,总之徒手165行,调试无BUG,基本功能的实现并无大问题,可能有些细节考虑不周(这也是C/C++的诟病,小车不倒只管前推),还忘见谅. 代码是在C++环境编写, ...

  10. Java打包多文件成zip

    package com.zh.java.util; import lombok.extern.slf4j.Slf4j; import java.io.File;import java.io.FileI ...