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

相关推荐
Z1Jxxx8 分钟前
日期日期日期
开发语言·c++·算法
Learner9 分钟前
Python函数
开发语言·python
_李小白16 分钟前
【Android FrameWork】延伸阅读:AMS 的 handleApplicationCrash
android·开发语言·python
报错小能手19 分钟前
nginx集群聊天室(一) 初步讲解集群聊天室所需库的搭建
c++·nginx
蕨蕨学AI19 分钟前
【Wolfram语言】45.1 数据集
开发语言·wolfram
黎雁·泠崖20 分钟前
Java入门篇之吃透基础语法(一):注释+关键字+字面量全解析
java·开发语言·intellij-idea·intellij idea
hqwest21 分钟前
码上通QT实战15--监控页面07-打开串口连接
开发语言·qt·多线程·signal·slot·emit·信号和槽
mjhcsp22 分钟前
C++ 后缀树(Suffix Tree):原理、实现与应用全解析
java·开发语言·c++·suffix-tree·后缀树
mjhcsp31 分钟前
C++ 有限状态自动机(FSM):原理、实现与应用全解析
开发语言·c++·有限状态自动机