首页 > 其他分享 >设计模式——观察者模式(发布/订阅模式)

设计模式——观察者模式(发布/订阅模式)

时间:2024-06-15 21:59:38浏览次数:15  
标签:Observer list 观察者 模式 new message 设计模式 subject

观察者模式(发布/订阅模式)

是一种行为模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使得它们能够自动更新自己。
在这里插入图片描述

#include <iostream>
#include <list>
#include <string>

using namespace std;

// 观察者(订阅者)的抽象类,里面包含一个Update方法
class IObserver
{
public:
    virtual ~IObserver(){};
    virtual void Update(const string &message_from_subject) = 0;
};

// 主题/通知者(发布者)的抽象类,里面包含add、remove等方法
class ISubject
{
public:
    virtual ~ISubject(){};
    virtual void Attach(IObserver *observer) = 0;
    virtual void Detach(IObserver *onserver) = 0;
    virtual void Notify() = 0;
};

// 发布者在状态发生变化时通知观察者
class Subject : public ISubject
{
public:
    virtual ~Subject()
    {
        cout << "Goodbye, I was the Subject. " << endl;
    }

    void Attach(IObserver *observer) override
    {
        list_observer_.push_back(observer);
    }

    void Detach(IObserver *observer) override
    {
        list_observer_.remove(observer);
    }

    void Notify() override
    {
        auto iterator = list_observer_.begin();
        cout << "There are " << list_observer_.size() << " observers in the list. " << endl;
        while (iterator != list_observer_.end())
        {
            (*iterator)->Update(message_);
            ++iterator;
        }
    }

    // 状态改变,通知订阅者
    void CreateMessage(string message = "Empty")
    {
        this->message_ = message;
        this->Notify();
    }

private:
    list<IObserver *> list_observer_;
    string message_;
};

// 具体的观察者
class Observer : public IObserver
{
public:
    Observer(ISubject *subject) : subject_(subject) // 依赖抽象,而非依赖具体的subject对象
    {
        this->subject_->Attach(this); // 添加到监听列表
        cout << "Hi, I'm the Observer \"" << ++Observer::static_number_ << "\".\n";
        this->number_ = Observer::static_number_;
    }

    virtual ~Observer()
    {
        cout << "Goodbye, I was the Observer \"" << this->number_ << "\".\n";
    }

    void Update(const string &message_from_subject) override
    {
        message_from_subject_ = message_from_subject;
        std::cout << "Observer \"" << this->number_ << "\": a new message is available --> " << this->message_from_subject_ << "\n";
    }

    void RemoveMeFromTheList()
    {
        subject_->Detach(this);
        cout << "Observer \"" << number_ << "\" removed from the list.\n";
    }

private:
    string message_from_subject_;
    ISubject *subject_;
    static int static_number_;
    int number_;
};

int Observer::static_number_ = 0;

// 客户端代码
void ClientCode()
{
    Subject *subject = new Subject;
    Observer *observer1 = new Observer(subject);
    Observer *observer2 = new Observer(subject);
    Observer *observer3 = new Observer(subject);
    Observer *observer4;
    Observer *observer5;

    subject->CreateMessage("Hello World! :D");
    observer3->RemoveMeFromTheList();

    subject->CreateMessage("The weather is hot today! :p");
    observer4 = new Observer(subject);

    observer2->RemoveMeFromTheList();
    observer5 = new Observer(subject);

    subject->CreateMessage("My new car is great! ;)");
    observer5->RemoveMeFromTheList();

    observer4->RemoveMeFromTheList();
    observer1->RemoveMeFromTheList();

    delete observer5;
    delete observer4;
    delete observer3;
    delete observer2;
    delete observer1;
    delete subject;
}

int main()
{
    ClientCode();
    return 0;
}

输出:

Hi, I'm the Observer "1".
Hi, I'm the Observer "2".
Hi, I'm the Observer "3".
There are 3 observers in the list. 
Observer "1": a new message is available --> Hello World! :D
Observer "2": a new message is available --> Hello World! :D
Observer "3": a new message is available --> Hello World! :D
Observer "3" removed from the list.
There are 2 observers in the list. 
Observer "1": a new message is available --> The weather is hot today! :p
Observer "2": a new message is available --> The weather is hot today! :p
Hi, I'm the Observer "4".
Observer "2" removed from the list.
Hi, I'm the Observer "5".
There are 3 observers in the list. 
Observer "1": a new message is available --> My new car is great! ;)
Observer "4": a new message is available --> My new car is great! ;)
Observer "5": a new message is available --> My new car is great! ;)
Observer "5" removed from the list.
Observer "4" removed from the list.
Observer "1" removed from the list.
Goodbye, I was the Observer "5".
Goodbye, I was the Observer "4".
Goodbye, I was the Observer "3".
Goodbye, I was the Observer "2".
Goodbye, I was the Observer "1".
Goodbye, I was the Subject. 
  • 观察者模式的特点
    观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化

标签:Observer,list,观察者,模式,new,message,设计模式,subject
From: https://blog.csdn.net/weixin_42903300/article/details/139707864

相关文章

  • Linux vim 文本编辑 操作文本 三种模式
    介绍vi是一个经典的行编辑器,支持模式编辑(包括普通模式、插入模式和命令模式)。vim保留vi核心功能的基础上,增加了多级撤销、语法高亮、插件支持等高级功能。两者的最大区别,简单的来说vim就是vi的增强版三种模式命令模式(CommandMode)默认进入的是命令模式。在这个模式......
  • 设计模式-组合模式
    组合模式组合模式,也称为整体部分模式,他的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性。(树形结构)组合与聚合的关系:组合生命周期保持一致。聚合具有不同的生命周期。角色:抽象根节点(Component):定义系统各......
  • 九星创客模式:创新引领新零售风潮
    九星创客模式确实是一种创新的商业模式,它结合了团队协作、多元化销售方式和激励机制,成功实现了产品的快速销售和客户群体的扩大。以下是关于九星创客模式的详细解析:1.团队结构与层级九星创客系统以团队为基础,每个成员都是团队的一部分,共同为达成销售目标而努力。系统设置了......
  • 稳定性与可持续性:九星创客模式的长期优势
    九星创客模式确实是一种创新的商业模式,它结合了团队协作、多元化销售方式和激励机制,成功实现了产品的快速销售和客户群体的扩大。以下是关于九星创客模式的详细解析:1.团队结构与层级九星创客系统以团队为基础,每个成员都是团队的一部分,共同为达成销售目标而努力。系统设置了......
  • java设计模式之-工厂模式
    工厂模式是一种创建对象的设计模式,它通过将对象的实例化过程封装在一个工厂类中,从而实现对象的创建和使用的解耦。它属于创建型模式的一种,可以帮助我们更加灵活地创建对象。工厂模式主要解决的问题是在对象的创建过程中,如果直接在代码中使用new关键字来创建对象,会导致代码的耦合......
  • 文献学习——PWM - PFM模式无缝转换的PFC变换器统一控制
    PWM-PFM模式无缝转换的PFC变换器统一控制摘要:断续导通模式通常应用在升压功率因数校正转换器中。这篇文章提出了一种基于虚拟阻抗原理的实现脉冲宽度调制控制和脉冲频率调制控制的统一控制方法。控制模式可以简单的通过只调整一个控制参数来改变。因此,在综合考虑电流纹波、......
  • C++多线程:生产者消费者模式
    文章目录一、模式简介二、头文件、全局变量2.1仓库类的设计2.1.1关于仓库类的分析2.1.2仓库类的设计代码2.2工厂类的设计2.2.1关于工厂类的分析2.2.2工厂类的设计代码a将产品item放到仓库repob将产品item从仓库repo取出c生产者操作d消费者操作2.2.3主函数代......
  • Java版SaaS模式云HIS系统源码Java+Spring+SpringBoot+SpringMVC 基层卫生健康云HIS源码
    Java版SaaS模式云HIS系统源码Java+Spring+SpringBoot+SpringMVC基层卫生健康云HIS源码云HIS全称为基于云计算的医疗卫生信息系统(Cloud-BasedHealthcareInformationSystem),是运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供......
  • 【pycharm调试模式异常】can‘t open file ‘C:\\Program‘: [Errno 2] No such fil
    错误系统:wendows10pycharm版本:pycharm专业版和社区版都有对应问题2023.1和2023.2都有同样问题python版本:3.11官网问题地址上面只是我出问题的环境,不知道其他环境或者版本有没有同样的问题现象:执行debug,程序启动后立即退出,错误信息:can’topenfile‘C:\Progra......
  • c/c++设计模式---观察者模式
    namespace_nmsp1{classFighter;//类前向声明list<Fighter*>g_playerList;//玩家父类(以往的战斗者类)classFighter{public:Fighter(inttmpID,stringtmpName):m_iPlayerID(tmpID),m_sPlayerName(tmpName)//构造函数......