简单讲解观察者设计模式

Crq
Crq
管理员
1718
文章
0
粉丝
Linux教程评论7字数 717阅读2分23秒阅读模式
摘要观察者模式是极其重要的一个设计模式,也是我几年开发过程中使用最多的设计模式,本文首先概述观察者模式的基本概念和Demo实现,接着是观察者模式在C++中的应用,最后是对观察者模式的应...

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

什么是观察者设计模式

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

解决的问题

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

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

编程思路

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

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

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

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

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

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

#include 
#include 
#include 
using namespace std;
class RecvBase
{
public:
    RecvBase()
    {
        cout > 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 > 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++示例讲解观察者设计模式的文章就介绍到这了

    weinxin
    我的微信
    微信号已复制
    我的微信
    这是我的微信扫一扫
     
    Crq
    • 本文由 Crq 发表于2025年2月22日 09:27:08
    • 转载请注明:https://www.cncrq.com/13156.html
    Docker容器内多进程管理(一)-Supervisor Linux教程

    Docker容器内多进程管理(一)-Supervisor

    Docker在设计时并不推崇在一个容器中运行多个进程,但在一些实际的场景中很多都可能需要在一个容器中,同时运行多个程序。在非容器的环境下系统初始化的时候,都会启动一个init进程,...
    匿名

    发表评论

    匿名网友
    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
    确定

    拖动滑块以完成验证