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

相关推荐
ajassi20005 小时前
开源 C++ QT Widget 开发(七)线程--多线程及通讯
linux·c++·qt·开源
bdgtd881786 小时前
动态修补C扩展模块的函数指针有哪些风险?安全的修补方案是什么?
c语言·开发语言·安全
mit6.8246 小时前
8.27 网格memo
c++·算法
jeffery8926 小时前
4056:【GESP2403八级】接竹竿
数据结构·c++·算法
luquinn6 小时前
实现统一门户登录跳转免登录
开发语言·前端·javascript
Forward♞6 小时前
Qt——界面美化 QSS
开发语言·c++·qt
快乐的划水a8 小时前
解释器模式及优化
c++·设计模式·解释器模式
##学无止境##8 小时前
解锁Java分布式魔法:CAP与BASE的奇幻冒险
java·开发语言·分布式
岁忧8 小时前
(LeetCode 每日一题) 498. 对角线遍历 (矩阵、模拟)
java·c++·算法·leetcode·矩阵·go
做一位快乐的码农9 小时前
基于Spring Boot的旅行足迹分享社区的设计与实现/基于java的在线论坛系统
java·开发语言·spring boot