zoukankan      html  css  js  c++  java
  • 观察者Observer模式C++实现

    Observer C++实现
    #include <string>
    #include 
    <iostream>
    #include 
    <set>

    class IObserver;

    class ISubject
    {
    public:
        
    virtual void registerObserver(IObserver * o) = 0;
        
    virtual void removeObserver(IObserver * o) = 0;
        
    virtual void notifyObservers() = 0;
    };


    class IObserver
    {
    protected:
        IObserver(){};
    public:
        
    virtual void update(float temp, float humidity, float pressure) = 0;

    };

    class IDisplayElement
    {
    protected:
        IDisplayElement(){};
    public:
        
    virtual void display() = 0;
    };


    typedef std::
    set<IObserver *> ObserverList;
    typedef std::
    set<IObserver *>::iterator ObserverListIter;

    class WeatherData: public ISubject
    {
    private:
        ObserverList m_Oberservers;
        
    float m_temp;
        
    float m_humidity;
        
    float m_pressure;

    public:
        WeatherData () {};
        
    ~WeatherData () {};
        
    virtual void registerObserver(IObserver * o)
        {
            m_Oberservers.insert(o);
        }
        
    virtual void removeObserver(IObserver * o)
        {
            ObserverListIter iter 
    = m_Oberservers.find(o);
            
    if (iter!=m_Oberservers.end())
            {
                m_Oberservers.erase(iter);
            }
        }
        
    virtual void notifyObservers()
        {
            ObserverListIter iter 
    = m_Oberservers.begin();
            
    for (;iter!=m_Oberservers.end();iter ++ )
            {
                
    // notify All Observers
                IObserver * pObserver = static_cast<IObserver *>(* iter);
                pObserver
    ->update(m_temp,m_humidity,m_pressure);
            }
        }
        
    void measurementsChanged()
        {
            notifyObservers();
        }

        
    void setMeasurements(float temp, float humidity, float pressure)
        {
            m_temp 
    = temp;
            m_humidity 
    = humidity;
            m_pressure 
    = pressure;
            measurementsChanged();
        }

    };


    class CurrentConditionsDisplay:public IObserver,public IDisplayElement
    {
        
    float m_temp;
        
    float m_humidity;
        ISubject 
    *m_WeatherData;

    public:

        
    virtual void update(float temp, float humidity, float pressure) 
        {
            m_temp 
    = temp;
            m_humidity 
    = humidity;
            display();
        }

        
    virtual void display()
        {
            std::cout 
    << "Current Conditions:" << m_temp << ","
                
    << m_humidity <<std::endl;
        }
        
    };



    class CurrentConditionsDisplay2:public IObserver,public IDisplayElement
    {
        
    float m_temp;
        
    float m_humidity;
        
    float m_pressure;

    public:


        
    virtual void update(float temp, float humidity, float pressure) 
        {
            m_temp 
    = temp;
            m_humidity 
    = humidity;
            m_pressure 
    = pressure;
            display();
        }

        
    virtual void display()
        {
            std::cout 
    << "Current Conditions2:" << m_temp << ","
                
    << m_humidity << "," << m_pressure <<std::endl;
        }

    };



    int main()
    {
        CurrentConditionsDisplay 
    * display1 = new CurrentConditionsDisplay();
        CurrentConditionsDisplay2 
    * display2 = new CurrentConditionsDisplay2();

        WeatherData 
    * data = new WeatherData();
        data
    ->registerObserver( display1);
        data
    ->registerObserver (display2);

        data
    ->setMeasurements(100,0,200);
        data
    ->setMeasurements(50,50,500);

        data
    ->removeObserver(display1);

        data
    ->setMeasurements(10,10,10);

        getchar();

        
    return 0;
    }
  • 相关阅读:
    拖拽文件上传demo
    JS权限树数据处理demo
    某面试题 a==1&&a==2&&a==3 的解决方案以及涉及知识
    解决forEach函数中异步调用及Promise.all()的基础使用
    基于element ui的el-date-picker 日、周、月粒度切换时间选择器
    基于element ui的el-table-column行内编辑input/select封装
    JavaScript优化技术
    vue-canvas-poster生成海报 jsZip打包称压缩包
    uniapp中使用uView时 TypeError: Cannot read property ‘mark‘ of undefined
    JS中深拷贝数组、对象、对象数组方法
  • 原文地址:https://www.cnblogs.com/mumuliang/p/1886243.html
Copyright © 2011-2022 走看看