C++设计模式中的观察者模式一起来看看

 更新时间:2022年03月13日 12:19:13   作者:贪心的葡萄  
这篇文章主要为大家详细介绍了C++观察者模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

设计模式:观察者模式

观察者模式也称发布订阅模式,发布者发布消息,订阅者接收消息。

  • 发布者接口
#ifndef __observerPatterns_publish_hpp__
#define __observerPatterns_publish_hpp__

#include "observerPatterns_subscribe.hpp"

class observerPatterns_publish
{
public:
    virtual void registerObjectSubscribe(observerPatterns_subscribe *ops) = 0;
    virtual void removeObjectSubscribe(observerPatterns_subscribe *ops) = 0;
    virtual void notifyObjectSubscribe() = 0;
};

#endif
  • 订阅者接口
#ifndef __observerPatterns_subscribe_hpp__
#define __observerPatterns_subscribe_hpp__

#include "observerPatterns_common.hpp"

class observerPatterns_subscribe
{
public:
    virtual void update(const observerPatterns_msgPackage &opmp) = 0;
};

#endif
  • 发布者类
#ifndef __observerPatterns_object_publish_hpp__
#define __observerPatterns_object_publish_hpp__

#include <unordered_set>
#include "observerPatterns_publish.hpp"

class observerPatterns_object_publish : public observerPatterns_publish
{
private:
    observerPatterns_msgPackage _opmp;
    std::unordered_set<observerPatterns_subscribe *> _subscribeObjectBucket;
public:
    observerPatterns_object_publish();
    ~observerPatterns_object_publish();
    void registerObjectSubscribe(observerPatterns_subscribe *ops);
    void removeObjectSubscribe(observerPatterns_subscribe *ops);
    void notifyObjectSubscribe();
    void setMsgPackage(const observerPatterns_msgPackage &opmp);
};

observerPatterns_object_publish::observerPatterns_object_publish()
{
}

observerPatterns_object_publish::~observerPatterns_object_publish()
{
}

void observerPatterns_object_publish::registerObjectSubscribe(observerPatterns_subscribe *ops)
{
    _subscribeObjectBucket.insert(ops);
}

void observerPatterns_object_publish::removeObjectSubscribe(observerPatterns_subscribe *ops)
{
    _subscribeObjectBucket.erase(ops);
}

void observerPatterns_object_publish::notifyObjectSubscribe()
{
    for (auto &&_sob : _subscribeObjectBucket)
        _sob->update(_opmp);
}

void observerPatterns_object_publish::setMsgPackage(const observerPatterns_msgPackage &opmp)
{
    _opmp = opmp;
    notifyObjectSubscribe();
}

#endif
  • 订阅者类
#ifndef __observerPatterns_object_subscribe_hpp__
#define __observerPatterns_object_subscribe_hpp__

#include "observerPatterns_publish.hpp"
#include "observerPatterns_subscribe.hpp"

class observerPatterns_object_subscribe : public observerPatterns_subscribe
{
private:
    observerPatterns_msgPackage _opmp;
    observerPatterns_publish *_opb;
public:
    observerPatterns_object_subscribe(observerPatterns_publish *opb);
    ~observerPatterns_object_subscribe();
    void update(const observerPatterns_msgPackage &opmp);
};

observerPatterns_object_subscribe::observerPatterns_object_subscribe(observerPatterns_publish *opb)
    :_opb(opb)
{
    _opb->registerObjectSubscribe(this);
}

observerPatterns_object_subscribe::~observerPatterns_object_subscribe()
{
    _opb->removeObjectSubscribe(this);
}

void observerPatterns_object_subscribe::update(const observerPatterns_msgPackage &opmp)
{
    _opmp = opmp;
    printf("url:%s, msg:%s\n", _opmp.url.c_str(), _opmp.msg.c_str());
}

#endif
#ifndef __observerPatterns_object_subscribe2_hpp__
#define __observerPatterns_object_subscribe2_hpp__

#include "observerPatterns_publish.hpp"
#include "observerPatterns_subscribe.hpp"

class observerPatterns_object_subscribe2 : public observerPatterns_subscribe
{
private:
    observerPatterns_msgPackage _opmp;
    observerPatterns_publish *_opb;
public:
    observerPatterns_object_subscribe2(observerPatterns_publish *opb);
    ~observerPatterns_object_subscribe2();
    void update(const observerPatterns_msgPackage &opmp);
};

observerPatterns_object_subscribe2::observerPatterns_object_subscribe2(observerPatterns_publish *opb)
    :_opb(opb)
{
    _opb->registerObjectSubscribe(this);
}

observerPatterns_object_subscribe2::~observerPatterns_object_subscribe2()
{
    _opb->removeObjectSubscribe(this);
}

void observerPatterns_object_subscribe2::update(const observerPatterns_msgPackage &opmp)
{
    _opmp = opmp;
    printf("url:%s, msg:%s\n", _opmp.url.c_str(), _opmp.msg.c_str());
}

#endif
  • 公共头文件
#ifndef __observerPatterns_common_hpp__
#define __observerPatterns_common_hpp__

#include <string>

struct observerPatterns_msgPackage
{
    std::string url;
    std::string msg;
};

typedef struct observerPatterns_msgPackage observerPatterns_msgPackage;

#endif
  • 主函数测试
/************************************************************************
    > File Name: observerPatterns_main.cpp
    > Author: 
    > Mail: 
    > Created Time: 
************************************************************************/

#include "observerPatterns_common.hpp"
#include "observerPatterns_object_publish.hpp"
#include "observerPatterns_object_subscribe.hpp"
#include "observerPatterns_object_subscribe2.hpp"

using namespace std;

int main(int argc, char *argv[])
{
    observerPatterns_object_publish *opop = new observerPatterns_object_publish;
    
    observerPatterns_msgPackage opmp1, opmp2;
    opmp1.url = "www.aaa.com";
    opmp1.msg = "Hello!";
    opmp2.url = "www.xyzxyz.com";
    opmp2.msg = "Hello, observerPatterns!";
    
    observerPatterns_object_subscribe *oposa = new observerPatterns_object_subscribe(opop);
    observerPatterns_object_subscribe *oposb = new observerPatterns_object_subscribe(opop);
    observerPatterns_object_subscribe2 *oposc = new observerPatterns_object_subscribe2(opop);
    observerPatterns_object_subscribe2 *oposd = new observerPatterns_object_subscribe2(opop);

    opop->setMsgPackage(opmp1);
    opop->setMsgPackage(opmp2);
    
    delete oposa;
    delete opop;
    return 0;
}

相关文章

  • C++计算ICMP头的校验和实例

    C++计算ICMP头的校验和实例

    这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
    2014-10-10
  • C++ string字符串的修改与替换方法详析

    C++ string字符串的修改与替换方法详析

    这篇文章主要给大家介绍了关于C++ string字符串修改与替换方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 使用pybind11封装C++结构体作为参数的函数实现步骤

    使用pybind11封装C++结构体作为参数的函数实现步骤

    这篇文章主要介绍了用pybind11封装C++结构体作为参数的函数实现步骤,本文分步骤通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 简单谈谈C++ 中指针与引用

    简单谈谈C++ 中指针与引用

    下面用通俗易懂的话来概述一下,指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。
    2015-09-09
  • 深入了解C语言中的动态内存分配

    深入了解C语言中的动态内存分配

    这篇文章主要为大家详细介绍了C语言中的动态内存分配,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,需要的可以参考一下
    2022-06-06
  • 详解C语言中函数宏的三种封装方式

    详解C语言中函数宏的三种封装方式

    函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。本文就来聊聊函数宏的三种封装方式吧
    2023-03-03
  • C语言利用结构体数组实现学生成绩管理系统

    C语言利用结构体数组实现学生成绩管理系统

    这篇文章主要为大家详细介绍了C语言利用结构体数组实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Qt实现自定义日志类的示例代码

    Qt实现自定义日志类的示例代码

    这篇文章主要为大家详细介绍了使用 qInstallMessageHandler() 实现一个简单的日志工具,文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2023-12-12
  • C++map,set,multiset,multimap详细解析

    C++map,set,multiset,multimap详细解析

    在C++标准模板库(STL)中,容器分为关联式容器和序列式容器两大类,关联式容器主要包括set、map、multiset和multimap,通过索引来访问元素,本文给大家介绍C++ map,set,multiset,multimap的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • QT .pro文件使用解析

    QT .pro文件使用解析

    QT工程的pro文件,在创建工程时由QTCreater自动创建,我们可以往里面添加内容,增加库文件的声明,包含路径、预处理器定义,生成目录,输出中间目录等等设置,本文就来介绍一下
    2022-04-04

最新评论