zoukankan      html  css  js  c++  java
  • 观察者模式

    Observer.h

    #ifndef _OBSERVER_H_
    #define _OBSERVER_H_
    #include <string>
    #include <iostream>
    #include <list>
    class ConcreteSubject;
    //抽象观察者
    class Observer
    {
    public:
        /**
         *@brief 更新接口
         */
        virtual void Update() = 0;
    };
    
    //具体观察者
    class ConcreteObserver: public Observer
    {
    public:
        ConcreteObserver(std::string name, ConcreteSubject* sub)
        {
            m_name = name;
            m_subject = sub;
        }
    
        //前台通知函数
        virtual void Update();
    
    
    private:
        std::string            m_name;
        std::string            m_observerState;
        ConcreteSubject*    m_subject;    //保存具体主题对象的指针,在更新时获取主题状态
        
    };
    
    #endif

    SubObject.h

    #ifndef _SECREATRY_H_
    #define _SECREATRY_H_
    #include <list>
    #include <string>
    class Observer;
    /**
     *@brief 抽象通知者类
     */
    class Subject
    {
    public:
        /**
         *@brief 增加观察者
         */
        virtual void Attach(Observer* pObserver)
        {
            m_pObservers.push_back(pObserver);
        }
        /**
         *@brief 减少观察者
         */
        virtual void Detach(Observer* pObserver)
        {
            m_pObservers.remove(pObserver);
        }
        /**
         *@brief 通知观察者
         */
        virtual void Notify()
        {
            for (auto pObserver : m_pObservers)
            {
                pObserver->Update();
            }
        }
    private:
        std::list<Observer*> m_pObservers;//所有观察者
    
    };
    
    /**
     *@brief 具体通知者
     */
    class ConcreteSubject : public Subject
    {
    private:
        std::string                    m_subjectState;            //被观察者观察的对象
    public:
        void SetState(const std::string& state)
        {
            m_subjectState = state;
        }
        const std::string& GetState()
        {
            return m_subjectState;
        }
    };
    #endif

    Observer.cpp

    #include "Observer.h"
    #include "SubObject.h"
    void ConcreteObserver::Update()
    {
        m_observerState = m_subject->GetState();
        std::cout << "观察者" << m_name << "新状态是" << m_observerState << std::endl;
    }

    Main.cpp

    #include "Observer.h"
    #include "SubObject.h"
    /*
    将系统分割成相互协作的类有不好的副作用,需要维护对象间的一致性,各类之间高度耦合,给维护和扩展带来不便
    
    */
    int main()
    {
        ConcreteSubject* pSub = new ConcreteSubject;
    
        ConcreteObserver ob1("zz", pSub);
        ConcreteObserver ob2("zss", pSub);
    
        pSub->Attach(&ob1);
        pSub->Attach(&ob2);
        pSub->SetState("吃饭了");
        pSub->Notify();
    
        getchar();
        return 0;
    }
  • 相关阅读:
    第三次冲刺
    第二次冲刺
    第一次冲刺
    Beta版本的发布
    第七次冲刺
    SpringMVC+Spring+mybatis 项目实践
    JSP显示新闻
    一个简单的静态邮箱登录界面
    Java Web 基础
    总结
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4356896.html
Copyright © 2011-2022 走看看