设计模式学习-Observer观察者模式

概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

Observer       观察者接口;

        Jack       观察者Jack

        Lucy       观察者Lucy

Observable  被观察者;

        Weather        被观察者对象;

这里的Weather 有温度 湿度等相关信息,每当 Weather天气数据更新时,作为观察者Jack和 Lucy希望能得到即时通知。。。

代码:

#include<iostream>
#include<vector>
#include<string>

using namespace std;

//观察者
class Observer
{
public:
	virtual void Update(float _temperature, float _humidity) = 0;
	string Getname()
	{
		return m_name;
	}
	string m_name;
};
class Jack : public Observer
{
public:
	Jack::Jack()
	{
		m_name = "Jack";
	}
	void Update(float _temperature, float _humidity)
	{
		cout << "今天的温度:" << _temperature << "\t湿度:" << _humidity <<" from " << m_name << endl;
	}

};

class Lucy : public Observer
{
public:
	Lucy::Lucy()
	{
		m_name = "Lucy";
	}
	void Update(float _temperature, float _humidity)
	{
		cout << "今天的温度:" << _temperature << "\t湿度:" << _humidity <<" from " << m_name << endl;
	}
	
};

//被观察者
class Observable
{
public:
	std::vector<Observer*> veclistObserver;
	virtual void AddObserver(Observer* pObserver) = 0;      //添加观察者
	virtual void RemoveObserver(Observer* pObserver) = 0;   //删除观察者
	virtual void notifyObservers() = 0;                     //通知所有观察者
};

class Weather : public Observable
{
public:
	Weather::Weather()
	{
		temperature = 0;
		humidity = 0;
	}
	void SetWeatherData(float _temperature, float _humidity)        //更新天气数据
	{
		temperature = _temperature;
		humidity = _humidity;
		string strInfo;
		notifyObservers();
	}
	void AddObserver(Observer* pObserver)
	{
		veclistObserver.push_back(pObserver);
	}
	void RemoveObserver(Observer* pObserver)
	{
		std::vector<Observer*>::iterator it;
		for(it = veclistObserver.begin();it!= veclistObserver.end();it++)
		{
			
			if( (*it)->m_name == pObserver->m_name)
			{
				veclistObserver.erase(it);
				break;
			}
		}
	}
	void notifyObservers()
	{
		std::vector<Observer*>::iterator it;
		for(it = veclistObserver.begin();it!= veclistObserver.end();it++)
		{
			(*it)->Update(temperature,humidity);
		}
	}
	float temperature;      //气温
	float humidity;         //湿度
};

int main()
{
	Weather weather;
	Lucy* observer1 = new Lucy();
	Jack* observer2 = new Jack();
	weather.AddObserver(observer1);
	weather.AddObserver(observer2);
	weather.SetWeatherData(26.0,40);
	getchar();
	return 0;
}

第107行SetWeatherData更新了天气数据,就会调用notifyObservers()(代码第69行),通知所有的观察者。

关注weather的观察者可以随时删除和添加。在某个观察者对天气信息不感兴趣时可随时删除。之后就不再会收到信息。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值