• 行为型模型 观察者模式


    行为型模型 观察者模式

    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;
    }
  • 相关阅读:
    Echrarts的基本API
    Echarts中Option属性设置
    大数据ETL处理时遇到的坑
    模块设计模式
    PAT (Advanced Level) Practice 代码
    递归中的 DFS 与 DP 比较
    CF 1557 D. Ezzat and Grid
    CF 1557 C. Moamen and XOR
    CF 1555 E. Boring Segments
    CF 1555 D. Say No to Palindromes
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7783112.html
Copyright © 2020-2023  润新知