C++示例讲解观察者设计模式

 更新时间:2022年12月26日 17:13:36   作者:编程远泊  
观察者模式是极其重要的一个设计模式,也是我几年开发过程中使用最多的设计模式,本文首先概述观察者模式的基本概念和Demo实现,接着是观察者模式在C++中的应用,最后是对观察者模式的应用场景和优缺点进行总结

引言

用来解决两个不相关对象之间的一对一或者一对多的通信模型。

什么是观察者设计模式

观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接受通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。

解决的问题

定义了对象间的一种一对多的组合关系,以便一个对象的状态发生时,所有依赖于它的对象都得到通知并自动刷新。

观察者和被观察者之间存在“观察”的逻辑关系,当被观察者发生变化时,观察者就会观察到这样的变化,并作出相应的响应。

编程思路

设定两者类,一个为观察者类,一个为被观察者类

观察者类中,定义一个对某个事件感兴趣的处理函数,一般也叫做槽函数

被观察者类中,定义一个数据结构,用来保存观察者对某一个事件id(信号)感兴趣,使用数据结构建立信号与对象之间的映射关系

被观察者类中,定义两个方法函数:

一个方法为:添加观察者与其感兴趣的事件id(信号)加入到容器中

另一个方法为:信号函数:通知事件函数执行逻辑:首先遍历容器中,有没有感兴趣的事件ID,如果有,则代表一系列的观察者,对这个事件感兴趣,那么再次遍历观察者列表,让每一个观察者执行相应的槽函数

#include <iostream>
#include <map>
#include <list>
using namespace std;
class RecvBase
{
public:
    RecvBase()
    {
        cout << "RecvBase structure" <<  endl;
    }
    virtual void slotFunctions(int msgid)=0;
    virtual ~RecvBase()
    {
        cout << "RecvBase destruct" << endl;
    }
};
class Recv:public RecvBase
{
public:
    Recv()
    {
        cout << "Recv structure" << "---" << this << "---" << endl;
    }
    void slotFunctions(int msgid)override
    {
        switch(msgid)
        {
        case 1:
            cout << this << "接收到1信号,执行1信号对应的槽函数" << endl;
            break;
        case 2:
            cout << this << "接收到2信号,执行2信号对应的槽函数" << endl;
            break;
        case 3:
            cout << this << "接收到3信号,执行3信号对应的槽函数" << endl;
            break;
        case 4:
            cout << this << "接收到4信号,执行4信号对应的槽函数" << endl;
            break;
        }
    }
    ~Recv()override
    {
        cout << "Recv destruct" << endl;
    }
};
class Sender
{
public:
    Sender()
    {
        cout << "sender structure" << endl;
    }
    map<int,list<RecvBase* >> RecvMap;
    void observerToRecvMap(int msgid,RecvBase* recv)
    {
        this->RecvMap[msgid].push_back(recv);
    }
    void senderSignals(int msgid)
    {
        auto it = RecvMap.find(msgid);
        if(it!=RecvMap.end())
        {
            for(RecvBase* p:it->second)
            {
                p->slotFunctions(msgid);
            }
        }else{
            cout << "接收到未知信号,没有对应的可执行槽函数" << endl;
        }
    }
    ~Sender()
    {
        cout << "sender destruct" << endl;
    }
};
int main()
{
    Sender sender;
    RecvBase* r1=new Recv();
    RecvBase* r2=new Recv();
    RecvBase* r3=new Recv();
    RecvBase* r4=new Recv();
    sender.observerToRecvMap(1,r1);
    sender.observerToRecvMap(1,r2);
    sender.observerToRecvMap(2,r2);
    sender.observerToRecvMap(3,r3);
    sender.observerToRecvMap(4,r4);
    while(true)
    {
        int msgid;
        cin >> msgid;
        if(-1==msgid)break;
        sender.senderSignals(msgid);
    }
    delete r1;
    delete r2;
    delete r3;
    delete r4;
    return 0;
}

知识小百科

this指针:

  • 是本对象的起始地址,用const修饰的常地址(原型:stu *const this)(本文代码中this的作用)
  • 是隐藏在成员函数(非静态函数)的最左侧的常变量形参

作用:

  • 区别成员属性和成员函数的形参
  • 解引用,返回本对象的地址

到此这篇关于C++示例讲解观察者设计模式的文章就介绍到这了,更多相关C++观察者设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C语言的mem系列函数

    详解C语言的mem系列函数

    这篇文章主要为大家详细介绍了C语言的mem系列函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C/C++实现获取硬盘序列号的示例代码

    C/C++实现获取硬盘序列号的示例代码

    获取硬盘的序列号、型号和固件版本号,此类功能通常用于做硬盘绑定或硬件验证操作,下面我们就来学习一下如何使用C/C++实现获取硬盘序列号吧
    2023-11-11
  • C语言 扫雷程序的实现

    C语言 扫雷程序的实现

    这篇文章主要介绍了C语言 扫雷程序的实现的相关资料,需要的朋友可以参考下
    2017-03-03
  • Qt(C++)调用工业相机Basler的SDK使用示例

    Qt(C++)调用工业相机Basler的SDK使用示例

    这篇文章主要介绍了Qt(C++)调用工业相机Basler的SDK使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C++进程间共享数据实例

    C++进程间共享数据实例

    这篇文章主要介绍了C++进程间共享数据的方法,是进行C++应用程序开发中非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • C语言中判断两个IPv4地址是否属于同一个子网的代码

    C语言中判断两个IPv4地址是否属于同一个子网的代码

    这篇文章主要介绍了C语言中判断两个IPv4地址是否属于同一个子网的代码,需要的朋友可以参考下
    2017-09-09
  • 简明的C++函数指针学习教程

    简明的C++函数指针学习教程

    这篇文章主要介绍了C++函数指针的学习教程,讲到了函数指针的定义及把指针作为函数参数进行传递的用法,需要的朋友可以参考下
    2016-04-04
  • C/C++中四种常用查找算法的实现

    C/C++中四种常用查找算法的实现

    C语言作为一种强大的编程语言,提供了多种搜索算法的实现方式,本文将介绍C语言中的四种常见搜索算法并提供每种算法的简单实现示例,需要的小伙伴可以参考下
    2023-11-11
  • C语言字符串函数模拟实现流程介绍

    C语言字符串函数模拟实现流程介绍

    字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝,计算长度,字符查找等的函数
    2022-09-09
  • C++设计模式之简单工厂模式的实现示例

    C++设计模式之简单工厂模式的实现示例

    这篇文章主要给大家介绍了关于C++设计模式之简单工厂模式的相关资料,简单工厂模式,主要用于创建对象,添加类时,不会影响以前的系统代码,需要的朋友可以参考下
    2021-06-06

最新评论