观察者模式
2020 年 09 月 11 日 213 435 字 暂无评论

01.概念

  • Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
  • Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

02.角色和职责

  • Subject(被观察者)

    • 被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
  • ConcreteSubject

    • 被观察者的具体实现。包含一些基本的属性状态及其他操作。
  • Observer(观察者)

    • 接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
  • ConcreteObserver

    • 观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

03.应用场景

  • 侦听事件驱动程序设计中的外部事件
  • 侦听/监视某个对象的状态变化
  • 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者
  • 适用于:

    • 定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于他们的对象都会得到通知。

04.代码案例

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Secretary;

//观察者
class PlayserObserver
{
public:
        PlayserObserver(string name, Secretary* secretary)
        {
                m_name = name;
                m_secretary = secretary;
        }
        void update(string action)
        {
                cout << m_name << "观察者收到 action:" << action << endl;
        }
private:
        string m_name;
        Secretary* m_secretary;
};

//通知者
class Secretary
{
public:
        void addObserver(PlayserObserver* o)
        {
                v.push_back(o);
        }
        void Notify(string action)
        {
                for (vector<PlayserObserver*>::iterator it = v.begin(); it != v.end(); it++)
                {
                        (*it)->update(action);
                }
        }
        void setAction(string action)
        {
                m_action = action;
                Notify(m_action);
        }

private:
        string m_action;
        vector<PlayserObserver*>v;
};

void main()
{
        //被观察者
        Secretary* s1 = new Secretary;

        PlayserObserver* p1 = new PlayserObserver("小明", s1);
        PlayserObserver* p2 = new PlayserObserver("小红", s1);
        s1->addObserver(p1);
        s1->addObserver(p2);
        s1->setAction("老板来了!");
        s1->setAction("老板走了! ");
        
        delete s1;
        delete p1;
        delete p2;
}
  • 输出
小明观察者收到 action:老板来了!
小红观察者收到 action:老板来了!
小明观察者收到 action:老板走了!
小红观察者收到 action:老板走了!

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/147/



评论已关闭