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

相关推荐
C++ 老炮儿的技术栈6 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程7 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力7 小时前
从0开始配置Perforce4环境
开发语言
幸运小圣8 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风1119 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪9 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
君顾19 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
传奇开心果编程11 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
泡泡鱼(敲代码中)11 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
I_belong_to_jesus12 小时前
std::unique_ptr成员函数用法
c++