美文网首页C++设计模式设计模式 BY C++设计模式
C++ 设计模式 —— 19.观察者模式

C++ 设计模式 —— 19.观察者模式

作者: JeremyYv | 来源:发表于2020-01-15 13:53 被阅读0次
  • 观察者模式:一种行为型设计模式

  • 应用场景:
    观察者模式定义了对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种交互也称为发布-订阅(publish-subscribe)。
    观察者模式在设计模式中的地位非常高,在各大框架中的应用随处可见。
    Qt框架中的信号槽机制就是观察者模式的典型应用:通过用户的点击,触发与按键点击所绑定的槽函数。

  • 举例:
    假设公司中的Boss要发邮件通知所有下属员工,那么首先需要在Boss端保存一个所有下属的邮箱列表,
    这样Boss要统一通知所有下属员工时,直接向列表中的邮箱逐个发送即可。

  • 实现方式:
    Boss类就是被观察者类,类中要有一个用以保存所有下属邮箱的容器,还要有一个通知容器中所有对象的方法。
    每名下属员工为一个观察者对象,有一个被通知的方法。


以下是观察者模式的简单代码实现
#include <iostream>
#include <set>
using namespace std;

//观察者抽象类
class Observer
{
public:
    virtual void ReceiveMail(string strMessage) = 0;
};

//被观察者抽象类
class Subject
{
public:
    virtual void AddObserver(Observer* pObserver) = 0;
    virtual void DeleteObserver(Observer* pObserver) = 0;
    virtual void SendMail(string strMessage) = 0;
};

//被观察者实现类
class Boss:public Subject
{
public:
    //添加观察者
    void AddObserver(Observer *pObserver)
    {
        setObs.insert(pObserver);
    }

    void DeleteObserver(Observer *pObserver)
    {
        setObs.erase(pObserver);
    }

    //通知所有观察者
    void SendMail(string strMessage)
    {
        for(auto iter = setObs.begin(); iter != setObs.end(); ++iter)
        {
            (*iter)->ReceiveMail(strMessage);
        }
    }

private:
    //存放观察者的容器
    set<Observer*> setObs;
};

//观察者实现类
class Staff:public Observer
{
public:
    Staff(string strName):m_strName(strName){}

    //收到通知,取邮件并显示
    void ReceiveMail(string strMessage)
    {
        cout << "Staff " << m_strName << " Receive Mail:" << strMessage << endl;
    }

private:
    string m_strName;
};
主函数中的使用
int main()
{
    Subject* pBoss = new Boss();

    Observer* pStaffA = new Staff("Mark");
    pBoss->AddObserver(pStaffA);
    Observer* pStaffB = new Staff("Jeremy");
    pBoss->AddObserver(pStaffB);

    pBoss->SendMail("test");

    return 0;
}
控制台输出结果
Staff Mark Receive Mail:test
Staff Jeremy Receive Mail:test

如有错误,欢迎指正

相关文章

  • C++ 设计模式 —— 19.观察者模式

    观察者模式:一种行为型设计模式 应用场景:观察者模式定义了对象间一对多的依赖关系,当一个对象的状态发生改变时,所有...

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 设计模式02-观察者者设计模式

    [toc] 设计模式02-观察者者设计模式 主要来源Head First设计模式(书)观察者设计模式是JDK中使用...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • Guava源码分析——EventBus

    EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。 1、程序示例...

  • 设计模式之观察者模式

    设计模式之观察者模式 本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式---观察者模式。 ...

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式

网友评论

    本文标题:C++ 设计模式 —— 19.观察者模式

    本文链接:https://www.haomeiwen.com/subject/settzctx.html