美文网首页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.观察者模式

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