C++观察者模式:订阅博主~

目录

观察者模式

观察者模式允许我们定义一种订阅机制,可在对象事件发生时通知所有的观察者对象,使它们能够自动更新。观察者模式还有另外一个名字叫做"发布-订阅"模式。

步骤

1:定义观察者接口

2:定义被观察者接口

3:创建具体观察者类

4:创建具体被观察者类

5:使用

例子:订阅博主

UML图

Inheritance Inheritance Composition 1 * Association 1 1 Blogger - list attach_list +void attach(Observer* ob) +void detach(Observer* ob) +void notify(string msg) Observer - string m_name - Blogger* m_blog +Observer(string name, Blogger* blog) +void unsubscribe() +void update(string msg) Zhanyun +void notify(string msg) Subscriber +Subscriber(string name, Blogger* blog) +void update(string msg)

1:定义观察者接口

cpp 复制代码
// 订阅者
class Observer {
public:
    Observer(string name, Blogger* blog) : m_name(name), m_blog(blog) {
        m_blog->attach(this);
    }
    void unsubscribe() {
        m_blog->detach(this);
    }
    virtual void update(string msg) = 0;
    virtual ~Observer() {}
protected:
    string m_name;
    Blogger* m_blog;
};

2:定义被观察者接口

cpp 复制代码
// 博主
class Blogger {
public:
    void attach(Observer* ob) {
        attach_list.push_back(ob);
    }
    void detach(Observer* ob) {
        attach_list.remove(ob);
    }
    virtual void notify(string msg) = 0;
    virtual ~Blogger() {}
protected:
    // 订阅者列表
    list<Observer*> attach_list;
};

3:创建具体观察者类

cpp 复制代码
class Subscriber : public Observer {
public:
    using Observer::Observer;
    void update(string msg) override {
        cout << m_name << " 收到博客更新: " << msg << endl;
    }
};

4:创建具体被观察者类

cpp 复制代码
// 博主 zhanyun
class Zhanyun : public Blogger {
public:
    void notify(string msg) override {
        cout << "博主 zhanyun 更新了博客,订阅者一共有<" << attach_list.size() << ">人" << endl;
        for (const auto& item : attach_list) {
            item->update(msg);
        }
    }
};

5:使用

cpp 复制代码
int main() {
    Zhanyun* zhanyun = new Zhanyun;
    Subscriber* A = new Subscriber("A", zhanyun);
    Subscriber* B = new Subscriber("B", zhanyun);
    zhanyun->notify("zhanyun 发布了一篇关于观察者模式的博客文章。");
    delete A;
    delete B;
    delete zhanyun;
    return 0;
}

执行结果

博主 zhanyun 更新了博客,订阅者一共有<2>人

A 收到博客更新: zhanyun 发布了一篇关于观察者模式的博客文章。

B 收到博客更新: zhanyun 发布了一篇关于观察者模式的博客文章。

C++学习资源

匠心精作C++从0到1入门编程-学习编程不再难

链接: https://pan.baidu.com/s/1q7NG28V8IKMDGD7CMTn2Lg?pwd=ZYNB 提取码: ZYNB

第二套、侯捷老师全系列八部曲 - 手把手教你进阶系列

链接: https://pan.baidu.com/s/1AYzdguXzbaVZFw1tY6rYJQ?pwd=ZYNB 提取码: ZYNB

相关推荐
j_xxx404_21 分钟前
C++:继承(概念及定义|作用域|基类与派生类转换|默认成员函数|与友元、静态成员关系|多继承|组合)
数据结构·c++
这人很懒没留下什么1 小时前
SpringBoot2.7.4整合Oauth2
开发语言·lua
ZHOUZAIHUI1 小时前
WSL(Ubuntu24.04) 安装PostgreSQL
开发语言·后端·scala
欧阳x天1 小时前
C++入门(二)
开发语言·c++
CappuccinoRose1 小时前
MATLAB学习文档(二十八)
开发语言·学习·算法·matlab
爱敲代码的loopy1 小时前
MATLAB函数全称解析:旋转翻转找数字
开发语言·matlab
月屯2 小时前
后端go完成文档分享链接功能
开发语言·后端·golang
Franciz小测测2 小时前
Python连接RabbitMQ三大方案全解析
开发语言·后端·ruby
代码雕刻家3 小时前
C语言的左对齐符号-
c语言·开发语言
小肖爱笑不爱笑3 小时前
2025/11/19 网络编程
java·运维·服务器·开发语言·计算机网络