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

相关推荐
DKPT27 分钟前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
L_autinue_Star42 分钟前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl
元气小嘉1 小时前
前端技术小结
开发语言·前端·javascript·vue.js·人工智能
励志的大鹰哥1 小时前
V少JS基础班之第七弹
开发语言·javascript·ecmascript
AI360labs_atyun2 小时前
Java在AI时代的演进与应用:一个务实的视角
java·开发语言·人工智能·科技·学习·ai
凤年徐2 小时前
【数据结构与算法】203.移除链表元素(LeetCode)图文详解
c语言·开发语言·数据结构·算法·leetcode·链表·刷题
nbsaas-boot3 小时前
多租户架构下的多线程处理实践指南
java·开发语言·spring
无小道3 小时前
c++--typedef和#define的用法及区别
c语言·开发语言·汇编·c++
SoniaChen333 小时前
Rust基础-part2-变量和可变类型
开发语言·后端·rust
mit6.8244 小时前
[Vroom] 位置与矩阵 | 路由集成 | 抽象,解耦与通信
c++·人工智能·算法