首页 > 代码库 > 观察者模式

观察者模式

1,所谓观察者模式就是跟站岗一样,只要收到通知国有,相应的通知而已

2.应用有,windows ,QT等一些消息通知机制,其实消息通知机制也就是观察者模式

3,样例背景,某公司,有个老板A,然后公司的员工上班,有的看NBA ,有的炒股,有一天老板A 突然了,然后秘书就给那些看NBA ,股票的员工们,发了一短信老板A来了,然后他们自己进行处理

4,代码:

// 观察者模式.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <list>

using namespace std;






//监视,观察,都有一个基类,派生,实现不同的效果
class Subject;


//观察器,需要接受欧消息,并且处理消息
class Observer{
protected:
	string name;    //指定名字
	Subject *sub;   //设置谁来通知我
public:
	Observer(string name, Subject *sub) :name(name), sub(sub){}
	virtual void update() = 0;    //当收到消息过后,我自己决定进行处理

};


//监事类,管理所有的观察者,增加,删除,发出消息,让观察者处理
class Subject{
protected:
	list<Observer *> observers;
public:
	string action;
	virtual void attach(Observer*) = 0;
	virtual void detach(Observer*) = 0;
	virtual void notify() = 0;    //通知观察者
};




class StackObserver :public Observer{
public:
	StackObserver(string name, Subject *sub) :Observer(name, sub){}
	void update();
};

void StackObserver::update(){
	cout << name << "收到信息" << sub->action << endl;
	if (sub->action == "A")
	{
		cout << "leader coming in, i will close stack" << endl;
	}
}

class NBAObserver :public Observer{
public:
	NBAObserver(string name, Subject *sub) :Observer(name, sub){}
	void update();
};

void NBAObserver::update(){
	cout << name << "收到信息" << sub->action << endl;
	if (sub->action == "A")
	{
		cout << "leader coming in, i will close NBA" << endl;
	}
}



class Secretary :public Subject{

public:

	void attach(Observer *observer){
		observers.push_back(observer);
	}


	void detach(Observer *observer){
		list<Observer*>::iterator itr = observers.begin();
		while (itr != observers.end())
		{
			if ((*itr) == observer )
			{
				observers.erase(itr);
			}
			itr++;
		}
	}
	void notify(){
		list<Observer*>::iterator iter = observers.begin();
		while (iter != observers.end() )
		{
			(*iter)->update();
			iter++;
		}

	}
};






int _tmain(int argc, _TCHAR* argv[])
{

	Subject *dwq = new Secretary();
	Observer *nba = new NBAObserver("NBAER", dwq);
	Observer *stack = new NBAObserver("STACKER", dwq);


	dwq->attach(nba);
	dwq->attach(stack);


	dwq->action = "hava lanch";
	dwq->notify();
	cout << endl;

	dwq->action = "A";
	dwq->notify();

	cin.get();

	return 0;
}


观察者模式