• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

观察者Observer模式C++实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
#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;
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言模拟实现多态发布时间:2022-07-13
下一篇:
了解何时使用Override和New关键字(C#编程指南)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap