服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 用C++11打造智能观察者模式:详解实现步骤完整示例代码

用C++11打造智能观察者模式:详解实现步骤完整示例代码

2024-04-08 15:11架构师老卢 C/C++

观察者模式是一种行为设计模式,其中一个对象(主题)维护其依赖对象(观察者)的列表,当主题的状态发生变化时,它通知所有观察者。以下是一个使用C++11实现观察者模式的简单例子

用C++11打造智能观察者模式:详解实现步骤完整示例代码

观察者模式是一种行为设计模式,其中一个对象(主题)维护其依赖对象(观察者)的列表,当主题的状态发生变化时,它通知所有观察者。以下是一个使用C++11实现观察者模式的简单例子:

  • 定义观察者接口(Observer): 创建一个观察者接口,该接口包含观察者需要实现的更新方法。这个接口可以包含其他方法,但更新方法是必须的。
  • 创建具体观察者类: 实现观察者接口的具体类。每个具体观察者类都应该实现更新方法,该方法定义了在主题状态变化时观察者应该执行的操作。
  • 定义主题接口(Subject): 创建一个主题接口,该接口包含了添加、移除和通知观察者的方法。这里可以选择在主题接口中定义更新状态的方法,也可以在具体主题类中定义。
  • 创建具体主题类: 实现主题接口的具体类。该类应该维护一个观察者列表,并在状态变化时通知所有观察者。
  • 实现客户端代码: 在客户端代码中创建具体的主题和观察者对象,将观察者添加到主题中。客户端还负责触发主题状态的变化,从而通知观察者。

下面是对上述步骤的更详细的讲解:

步骤 1:定义观察者接口

// Observer.h
#pragma once

class Observer {
public:
    virtual void update(int data) = 0;
};

步骤 2:创建具体观察者类

// ConcreteObserverA.h
#pragma once
#include <iostream>
#include "Observer.h"

class ConcreteObserverA : public Observer {
public:
    void update(int data) override {
        std::cout << "Observer A 收到更新,数据为: " << data << std::endl;
    }
};
// ConcreteObserverB.h
#pragma once
#include <iostream>
#include "Observer.h"

class ConcreteObserverB : public Observer {
public:
    void update(int data) override {
        std::cout << "Observer B 收到更新,数据为: " << data << std::endl;
    }
};

步骤 3:定义主题接口

// Subject.h
#pragma once
#include "Observer.h"

class Subject {
public:
    virtual void addObserver(Observer* observer) = 0;
    virtual void removeObserver(Observer* observer) = 0;
    virtual void notifyObservers(int data) = 0;
};

步骤 4:创建具体主题类

// ConcreteSubject.h
#pragma once
#include <vector>
#include "Subject.h"

class ConcreteSubject : public Subject {
private:
    std::vector<Observer*> observers;
    int data;

public:
    void addObserver(Observer* observer) override {
        observers.push_back(observer);
    }

    void removeObserver(Observer* observer) override {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    void notifyObservers(int data) override {
        for (Observer* observer : observers) {
            observer->update(data);
        }
    }

    void setData(int newData) {
        data = newData;
        notifyObservers(data);
    }

    int getData() const {
        return data;
    }
};

步骤 5:实现客户端代码

// main.cpp
#include "ConcreteObserverA.h"
#include "ConcreteObserverB.h"
#include "ConcreteSubject.h"

int main() {
    ConcreteSubject subject;
    ConcreteObserverA observerA;
    ConcreteObserverB observerB;

    subject.addObserver(&observerA);
    subject.addObserver(&observerB);

    subject.setData(123);

    subject.removeObserver(&observerA);

    subject.setData(456);

    return 0;
}

在这个例子中,我们创建了抽象观察者类 Observer,具体观察者类 ConcreteObserverA 和 ConcreteObserverB。然后,我们定义了抽象主题类 Subject 和具体主题类 ConcreteSubject。最后,在客户端代码中,我们创建了具体的主题和观察者对象,将观察者添加到主题中,并演示了状态变化时如何通知观察者,以及如何移除观察者。

原文地址:https://www.toutiao.com/article/7305927309276791335/

延伸 · 阅读

精彩推荐
  • C/C++浅谈c++构造函数问题,初始化和赋值问题

    浅谈c++构造函数问题,初始化和赋值问题

    下面小编就为大家带来一篇浅谈c++构造函数问题,初始化和赋值问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网8732021-04-25
  • C/C++C语言绘制三角函数曲线

    C语言绘制三角函数曲线

    这篇文章主要为大家详细介绍了C语言绘制三角函数曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Snowalive11132021-07-30
  • C/C++Windows程序内部运行机制实例详解

    Windows程序内部运行机制实例详解

    这篇文章主要介绍了Windows程序内部运行机制实例详解,对于学习Windows程序设计来说是非常重要的一课,需要的朋友可以参考下...

    C语言程序设计9042021-01-27
  • C/C++C++实现LeetCode(147.链表插入排序)

    C++实现LeetCode(147.链表插入排序)

    这篇文章主要介绍了C++实现LeetCode(147.链表插入排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang6222021-12-07
  • C/C++学习C++指针声明和指针相关概念

    学习C++指针声明和指针相关概念

    C++ 指针学习起来有点难,但是很重要。一些 C++ 程序使用指针更容易执行,另外其他 C++ 程序,例如动态内存分配,没有指针就无法执行。...

    Python之王7472021-06-11
  • C/C++C++数据结构继承的概念与菱形继承及虚拟继承和组合

    C++数据结构继承的概念与菱形继承及虚拟继承和组合

    今天我要给大家介绍C++中更深入的内容了。C++这门语言为了使代码不冗余,做了些什么操作呢?C++的继承就很好地实现了类层次的代码复用,今天我就要来...

    呆呆兽学编程10242022-10-10
  • C/C++C++设计模式之模板方法模式

    C++设计模式之模板方法模式

    这篇文章主要介绍了C++设计模式之模板方法模式,本文讲解了什么是模板方法模式、模板方法模式的UML类图、模板方法模式的使用场合等内容,需要的朋友可...

    果冻想6382021-02-05
  • C/C++详解C++编程的多态性概念

    详解C++编程的多态性概念

    这篇文章主要介绍了C++编程的多态性概念,是C++入门学习中的基础知识,需要的朋友可以参考下...

    C++教程网7532021-03-14