代码改变世界

观察者模式

2015-04-16 23:13  foolbread-老陈  阅读(125)  评论(0编辑  收藏  举报

    观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。——《HEAD FIRST 设计模式》

    我的c++代码

#ifndef DESIGN_OBSERVER_H_
#define DESIGN_OBSERVER_H_
#include <list>
class Observer;

class Subject
{
public:
    void registerObserver(Observer* o);
    void removeObserver(Observer* o);
    void notifyObserver();
private:
    std::list<Observer*> m_obj;
};

class Observer
{
public:
    virtual void update() = 0;
};

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

///////////////////////////////////
class WeatherData: public Subject
{
public:
    int getTemperature(){return this->t;}
    int getHumidity(){return this->h;}
    int getPressure(){return this->p;}
private:
    int t; //temperature
    int h; //humidity
    int p; //pressure
};
////////////////////////////////////

class CurrentConditionDisplay:public Observer,DisplayElement
{
public:
    void update();
    void display();
};

class StatisticsDisplay:public Observer,DisplayElement
{
public:
    void update();
    void display();
};

class ForecastDisplay:public Observer,DisplayElement
{
public:
    void update();
    void display();
};

class ThirdPartyDisplay:public Observer,DisplayElement
{
public:
    void update();
    void display();
};

#endif // DESIGN_OBSERVER_H_
#include "observer.h"
#include <iostream>

void Subject::registerObserver(Observer* o)
{
   this->m_obj.push_back(o);
}

void Subject::removeObserver(Observer* o)
{
    this->m_obj.remove(o);
}

void Subject::notifyObserver()
{
    std::list<Observer*>::iterator it = this->m_obj.begin();
    for (; it != this->m_obj.end(); ++it)
    {
         (*it)->update();
    }
}

////////////////////////////////////////////
void CurrentConditionDisplay::update()
{
    this->display();
}

void CurrentConditionDisplay::display()
{
    std::cout << "CurrentConditionDisplay display!" << std::endl;
}

void StatisticsDisplay::update()
{
    this->display();
}

void StatisticsDisplay::display()
{
    std::cout << "StatisticsDisplay display!" << std::endl;
}

void ForecastDisplay::update()
{
    this->display();
}

void ForecastDisplay::display()
{
    std::cout << "ForecastDisplay display!" << std::endl;
}

void ThirdPartyDisplay::update()
{
    this->display();
}

void ThirdPartyDisplay::display()
{
    std::cout << "ThirdPartyDisplay display!" << std::endl;
}
    个人感悟:待留。