行为型模型 观察者模式

行为型模型 观察者模式

 

 

 

Subject(被观察者)
        被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
        被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
        接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver
        观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

 

典型应用
        - 侦听事件驱动程序设计中的外部事件
        - 侦听/监视某个对象的状态变化
        - 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者
适用于:
        定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于他们的对象都会得到通知。
使用场景:
        定义了一种一对多的关系,让多个观察对象(公司员工)同时监听一个主题对象(秘书),主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自己。

 

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

#define _CRT_SECURE_NO_WARNINGS

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

// 前置声明
class Secretary;

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

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

void mytest()
{
    // subject 被观察者 
    Secretary *s1 = new Secretary();
    // 具体的观察者 被通知对象
    PlayerObserver *po1 = new PlayerObserver("小张", s1);
    PlayerObserver *po2 = new PlayerObserver("小李", s1);
    s1->addObserver(po1);
    s1->addObserver(po2);
    s1->setAction("老板来了");
    s1->setAction("老板走了");

    delete po1;
    po1 = nullptr;
    delete po2;
    po2 = nullptr;
    delete s1;
    s1 = nullptr;

    return;
}


int main()
{
    mytest();

    system("pause");
    return 0;
}

 

posted @ 2017-11-04 13:24  lsgxeva  阅读(301)  评论(0编辑  收藏  举报