设计模式----------------------观察者模式

观察者模式的优点:定义了一个一对多的关系,让多个多个观察者同时监听一个主题对象,当主题对象发生变化的时候,会通知所有的观察者,使他们能够更新自己。

具体的结构图如下:




在图中可以看出,在观察者中维护了一个具体主题对象(Subject),用来维护主题对象发来的消息。

而在主题对象中也维护了一个观察者对象(Observer),用来插入观察者对象并对其发送具体的通知。


具体使用源码如下:




#include <string>
#include <iostream>
#include <vector>
using namespace std;

//
class SecretaryBase;


//抽象观察者
class CObserverBase{
protected:
	string name;
	SecretaryBase *sub;

public:
	CObserverBase(string strName, SecretaryBase* strSub){
		name = strName;
		sub = strSub;
	}

	virtual void Update() = 0;

};



//具体的观察者。看股票的
class StockObserver :public CObserverBase{

public:
	StockObserver(string strName, SecretaryBase* strSub):CObserverBase(strName , strSub){

	}


	virtual void Update();
};


//具体观察者,看NBA的
class NBAObserver :public CObserverBase{

public:
	NBAObserver(string strName, SecretaryBase * strSub):CObserverBase(strName , strSub){}

	virtual void Update();
};




//抽象通知者

class SecretaryBase{

protected:
	string action;
	vector<CObserverBase*> observers;
	

public:
	virtual void Attach(CObserverBase* observer) = 0;
	virtual void Notify() = 0;
	virtual string GetAction() = 0;
	virtual void SetAction(string strAction) = 0;
};

//具体通知者

class Secretary :public SecretaryBase{
public:
	void Attach(CObserverBase* ob){
		observers.push_back(ob);
	}

	void Notify(){


		vector<CObserverBase*>::iterator p = observers.begin();

		while (p != observers.end())
		{
			(*p)->Update();
			p++;
		}
	}

	string GetAction(){

		return  action;
	}


	void SetAction(string strAction){
		action = strAction;
	}

};


void StockObserver::Update(){

	cout << name << "." << sub->GetAction() << ",不要玩股票了,要开始工作了" << endl;
}

void NBAObserver::Update(){

	cout << name << ":" << sub->GetAction() << ",不要看NBA来了,要开始工作了" << endl;
}


int main(){

	SecretaryBase *p = new Secretary;


	CObserverBase* s1 = new NBAObserver("小王", p);
	CObserverBase *s2 = new StockObserver("小李", p);

	p->Attach(s1);
	p->Attach(s2);

	p->SetAction("老板要来了");

	p->Notify();


	getchar();
	getchar();

	return 0;



}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值