首页 > 编程语言 >如何用C++11实现观察者模式

如何用C++11实现观察者模式

时间:2023-07-10 17:32:16浏览次数:43  
标签:11 void 观察者 C++ observers unique obs subject

观察者模式是一种设计模式,定义了对象之间的一对多关系。当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新。在C++11中,可以通过以下方式实现观察者模式:

首先,我们需要创建一个观察者接口,其中包含一个更新方法。这个接口可以被多个观察者类实现,从而实现多态。

#include <iostream>  
#include <functional>  
#include <vector>  
  
using namespace std;  
  
class Observer {  
public:  
    virtual void update() = 0;  
};  
  
class Subject {  
private:  
    vector<unique_ptr<Observer>> observers;  
  
public:  
    void registerObserver(unique_ptr<Observer> obs) {  
        observers.push_back(move(obs));  
    }  
  
    void removeObserver(unique_ptr<Observer> obs) {  
        observers.erase(remove(observers.begin(), observers.end(), obs), observers.end());  
    }  
  
    void notifyObservers() {  
        for (auto& obs : observers) {  
            obs->update();  
        }  
    }  
};

接下来,我们可以创建一个具体的观察者类,它实现观察者接口,并注册到主题对象中。

class ConcreteObserver : public Observer {  
public:  
    ConcreteObserver(Subject& subject) : subject_(subject) {  
        subject.registerObserver(make_unique<ConcreteObserver>(*this));  
    }  
  
    void update() override {  
        // do something based on the subject's state  
        cout << "Subject state has changed!" << endl;  
    }  
  
private:  
    Subject& subject_;  
};

现在,我们可以创建一个主题对象,并注册多个观察者对象。当主题对象的状态发生改变时,它会通知所有的观察者对象。

int main() {  
    Subject subject;  
    ConcreteObserver observer1(subject);  
    ConcreteObserver observer2(subject);  
    // ... more observers ...  
    subject.notifyObservers(); // initial notification or state change  
    return 0;  
}

在上面的例子中,我们使用了C++11的一些特性,如auto关键字推断类型、unique_ptr智能指针和范围for循环。这样可以使代码更加简洁、安全和易于维护。

标签:11,void,观察者,C++,observers,unique,obs,subject
From: https://blog.51cto.com/daniusdk/6663874

相关文章

  • C++类模板实现工厂模式(优化if else/switch case)
    引自:https://blog.csdn.net/weixin_43795921/article/details/127224633template<typenameIdentifierType,classAbstractProduct,classProductCreator=AbstractProduct*(*)(),classMapContainer=std::map<IdentifierType,ProductCreato......
  • Selenium基础:其他设置 11
    1、限制页面加载时间设置页面加载限制时间:set_page_load_timeout(time)#-*-coding:utf-8-*-fromseleniumimportwebdriverfromselenium.common.exceptionsimportTimeoutExceptiondriver=webdriver.Chrome()#限制页面加载时间为30sdriver.set_page_load_timeout(30......
  • C++ 数据抽象
     数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD播......
  • C++题解——格子游戏
    题目链接:一本通TFLSOJ思路:使用并查集给点连接,如果在连接过程中遇到已连接的点二次连接,就输出代码:#include<bits/stdc++.h>usingnamespacestd;structnode{ intx,y;};nodef[205][205];intn,m;nodefind(nodek){ if(f[k.x][k.y].x==k.x&&f[k.x][k.y].y==k.y)retur......
  • c/c++程序编译运行全过程
    一.预处理-gcc-E1.进行头文件的替换(执行预处理指令)2.删除注释3.不会检查语法二.编译-gcc-S1.会检查语法2.将C语言代码翻译成对应平台的汇编语言三.汇编-gcc-c将汇编语言翻译成二进制指令四.链接-gcc-o把用到的标准库的函数实现,系统启动代码一并链接到最后生成的可......
  • tomcat安装solr-8.11.2
    tomcat安装solr-8.11.2下载solr#解压tar-xzfsolr-8.11.2.tgz#制作war包cdsolr-8.11.2/server/solr-webapp/webapp/jarcvfsolr.war./*#将制作的war包复制到tomcat的webapps目录下cpsolr.war/tmp/apache-tomcat-9.0.75/webapps/#启动tomcat自动解压solr.warcd......
  • 2023ACM暑假训练day 11 动态规划
    目录DAY11动态规划训练情况简介题题题题DAY11动态规划训练地址:传送门训练情况简介2023-07-1009:30:17星期一早上:下午:晚上:题题意:思路:题题意:思路:题题意:思路:题题意:思路:......
  • 华为工程师(王桂林)带你实战C++
    适合人群:有一定的C语言基础或是想提高C++水平的在职人员或是想要从事C、C++开发的绝大多数人你将学到:本课程我以实战为主,课上全部代码均为边讲边手敲,学会此套课程,可以达到一个C++中高级研发者的水平。课程简介:王桂林老师,曾供职于海尔,华为等世界500强企业。现在专职于C++教......
  • A011 《千变万化》编程 源码
    一、课程介绍本节课用嵌套for循环、input()获取用户输入、int()转换为整数类型,绘制一个由正多边形组成的花朵。二、重难点解析数据类型数据有类型区分,常用的有整数类型和字符串类型。像10、37、-17、0等数字就是整数类型;而'3'、'27'、'一语惊醒梦中人'、'yyjxmzr'等被引号......
  • [C/C++] 函数
    疑问1、函数结束后,函数栈释放的内容有哪些?2、通过函数修改形参的值怎么实现?值传递还是引用传递?基本类型、数组、结构体有什么区别?3、如果想通过函数对实参进行malloc,为什么必须用二级指针?函数栈空间在一个函数执行完毕后其所占用的内存空间(除了静态和全局变量)统统会被释放......