笑看风云

记录生活中的启迪与感动
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式之观察者模式(Observer)

Posted on 2010-01-14 10:01  清晨的风  阅读(237)  评论(0编辑  收藏  举报

类图:

observer

 

C++代码:

#include <list>
#include <iostream>

using namespace std;

class Observer;
class Subject
{
public:
	virtual void attach(Observer *o)=0;
	virtual void change()=0;
	virtual void setWeather(string str)=0;
	virtual string getWeather()=0;
};
class Observer
{
public:
	virtual string getName()=0;
	virtual void update(Subject *s)=0;
};

class Earth:public Subject
{
private:
	string weather;
	list *l;
public:
	Earth()
	{
		l = new list();
	}
	void attach(Observer *o)
	{
		this->l->push_back(o);
	};
	void change()
	{
		for(list::iterator it=l->begin();it!=l->end();++it)
		{
			(*it)->update(this);
		}
	};
	void setWeather(string str)
	{
		this->weather=str;
		change();
	};
	string getWeather()
	{
		return this->weather;
	};
};
class Satellite:public Observer
{
private:
	string name;
public:
	Satellite(string str)
	{
		name=str;
	}
	string getName()
	{
		return name;
	};
	void update(Subject *s)
	{
		cout〈〈this->getName()+" "+s->getWeather()<};
};


int main()
{
	Earth e;
	Satellite *s1 = new Satellite("风云一号");
	Satellite *s2 = new Satellite("风云二号");
	Satellite *s3 = new Satellite("风云三号");
	Satellite *s4 = new Satellite("风云四号");
	e.attach(s1);
	e.attach(s2);
	e.attach(s3);
	e.attach(s4);
	e.setWeather("fine");
	return 0;
}