c++实现设计模式中的观察者模式,削除代码的if else switch

编译器需支持c++11,已在win7下用vs2013,linux下测试,win中用cmake生成相应的*.sln文件,在linux下用cmake生成相应的Makefile文件

该文章有以下几个学习点:

1、单例模式:

创建单例对象为什么用静态对象,而不是new 呢?

2、设计模式之观察者模式

3、如果是服务端,如果有地方用到大量的if else 或者switch,可以用该思路实现

另外该实现有点类似于qt的signal/slot  :)

以下是栗子了:


*********分割线********************************************************************************************************************


创建route_manager.h文件

#ifndef _H_ROTE_MANAGER_H_
#define _H_ROTE_MANAGER_H_


#include <unordered_map>
#include <functional>


class RouteManager
{
public:
RouteManager();
~RouteManager();


public:
void RegisteHandler(int cmd, std::function<void(const char*)> fun);
void SetData(int cmd, const char* szData);


private:
std::unordered_multimap<int, std::function<void(const char*)>> m_routeMap;
};


*********分割线********************************************************************************************************************

创建 route_manager.cpp文件


#include "route_manager.h"


RouteManager::RouteManager()
{

}


RouteManager::~RouteManager()
{

}


void RouteManager::RegisteHandler(int cmd, std::function<void(const char*)> fun)
{
m_routeMap.emplace(cmd, fun);
}


void RouteManager::SetData(int cmd, const char* szData)
{
auto itRange = m_routeMap.equal_range(cmd);
for(auto it = itRange.first; it != itRange.second; ++it)
{
std::function<void(const char*)> fun = (*it).second;
fun(szData);
}
}


*********分割线********************************************************************************************************************

创建公共文件 public.h,单例

#ifndef _H_PUBIC_H_
#define _H_PUBIC_H_


template<class T>
class Singleton
{
public:
static T& GetInstance()
{
if(!m_instance)
{
static T _instance;
m_instance = &_instance;
}
return *m_instance;
}


private:
Singleton();
Singleton(const Singleton&);
Singleton& operator = (const Singleton&);
static T *m_instance;
};
template<class T>
T* Singleton<T>::m_instance = nullptr;


#endif


*********分割线********************************************************************************************************************

创建 main.cpp,测试class


#include "stdio.h"
#include "stdlib.h"
#include "route_manager.h"
#include "public.h"


class TestA
{
public:
TestA(){}
~TestA(){}
void Print(const char* szData)
{
printf("TestA.Print: %s\n", szData);
}
};




class TestB
{
public:
TestB(){}
~TestB(){}
void Print(const char* szData)
{
printf("TestB.Print: %s\n", szData);
}


void SetData(const char* szData)
{
printf("TestB.SetData: %s\n", szData);
}
};


#define g_routeManager Singleton<RouteManager>::GetInstance()


int main(int argc, char** argv)
{
printf("Hello !\n");
TestA a;
TestB b;


g_routeManager.RegisteHandler(1, std::bind(&TestA::Print, &a, std::placeholders::_1));
g_routeManager.RegisteHandler(2, std::bind(&TestB::Print, &b, std::placeholders::_1));
g_routeManager.RegisteHandler(2, std::bind(&TestB::SetData, &b, std::placeholders::_1));


g_routeManager.SetData(1, "Test: Hello !");
g_routeManager.SetData(2, "Test: Hello !");
getchar();
return 0;
}


*********分割线********************************************************************************************************************

CMakeLists.txt文件


PROJECT(ROUTE_DATA) 
if(WIN32)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
endif()
if(UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
#SET(SRC_LIST src/main.cpp)
AUX_SOURCE_DIRECTORy(src SRC_LIST)
ADD_EXECUTABLE(routeDataTest ${SRC_LIST})

*********分割线********************************************************************************************************************

欢迎加入QQ群(565993954)进行c++技术交流 ^!^ ,可在以下链接下载源码:http://download.csdn.net/detail/shaosheng2008/9829377


*********分割线********************************************************************************************************************
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值