简单的C++订阅者发布者模型示例

以下是一个简单的C++订阅者发布者模型示例:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
​
// 订阅者接口
class Subscriber
{
public:
    virtual ~Subscriber() {};
    virtual void update(const string& message) = 0; // 更新消息
};
​
// 发布者接口
class Publisher
{
public:
    virtual ~Publisher() {};
    virtual void addSubscriber(Subscriber* subscriber) = 0; // 添加订阅者
    virtual void removeSubscriber(Subscriber* subscriber) = 0; // 移除订阅者
    virtual void notify(const string& message) = 0; // 通知订阅者
};
​
// 具体订阅者类
class ConcreteSubscriber : public Subscriber
{
public:
    ConcreteSubscriber(const string& name) : m_name(name) {}
​
    virtual void update(const string& message)
    {
        cout << "收到来自" << m_name << "的消息:" << message << endl;
    }
​
private:
    string m_name; // 订阅者名字
};
​
// 具体发布者类
class ConcretePublisher : public Publisher
{
public:
    virtual ~ConcretePublisher()
    {
        // 释放订阅者列表内存
        for (vector<Subscriber*>::iterator it = m_subscribers.begin(); it != m_subscribers.end(); ++it)
        {
            delete (*it);
        }
        m_subscribers.clear();
    }
​
    virtual void addSubscriber(Subscriber* subscriber)
    {
        m_subscribers.push_back(subscriber);
    }
​
    virtual void removeSubscriber(Subscriber* subscriber)
    {
        for (vector<Subscriber*>::iterator it = m_subscribers.begin(); it != m_subscribers.end(); ++it)
        {
            if (*it == subscriber)
            {
                m_subscribers.erase(it);
                break;
            }
        }
    }
​
    virtual void notify(const string& message)
    {
        for (vector<Subscriber*>::iterator it = m_subscribers.begin(); it != m_subscribers.end(); ++it)
        {
            (*it)->update(message);
        }
    }
​
private:
    vector<Subscriber*> m_subscribers; // 订阅者列表
};
​
int main()
{
    // 创建发布者对象
    ConcretePublisher* publisher = new ConcretePublisher();
​
    // 创建订阅者对象
    Subscriber* sub1 = new ConcreteSubscriber("订阅者1");
    Subscriber* sub2 = new ConcreteSubscriber("订阅者2");
​
    // 添加订阅者
    publisher->addSubscriber(sub1);
    publisher->addSubscriber(sub2);
​
    // 发布消息
    publisher->notify("这是一条测试消息");
​
    // 移除订阅者
    publisher->removeSubscriber(sub1);
​
    // 再次发布消息
    publisher->notify("这是另一条测试消息");
​
    // 释放内存
    delete publisher;
    delete sub1;
    delete sub2;
​
    return 0;
}

在这个示例中,订阅者通过实现Subscriber接口中的update方法来接收来自发布者的消息。发布者通过添加和移除订阅者、通知订阅者来实现消息发布的功能。当发布者发布一条消息时,它会通知所以订阅者,每个订阅者会根据自己实现update方法来处理消息。

本文福利, 免费领取C++学习资料包、技术视频/代码,内容包括(C++基础,网络编程,数据库,中间件,后端开发,音视频开发,Qt开发)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_73443478/article/details/130366990