觀察者Observer模式C++實現

來源:互聯網
上載者:User
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;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.