设计模式-观察者模式

网上的观察者模式学习资料很多,以下是我的想法,如果有更好的方法,请提出一些好的建议,谢谢,

============================================

观察者模式,主要是两个部分

1.观察者

2.发布者(发布的管理中心)

建立一个观察者父类,然后让每一个观察者去继承这个总的父类。Update()函数,去更新值

建立一个发布中心类,然后让具有发布功能的那个类去继承发布中心。在发布中心里建立一个列表去存储各个观察者,添加观察者,删除观察者,通知观察者。


#include "stdio.h"
#include "string.h"
#include "iostream"
#include "list"
using namespace std;
//观察者
class Observer{
public :
	Observer(){}
	virtual ~Observer(){}
	virtual void Update(){}
};
//Subject
class Subject{
private:
	list <Observer*> _observer;
public :
	virtual ~Subject(){}
	virtual void Attach(Observer* o){ _observer.push_back(o); }
	virtual void Detach(Observer* o){ _observer.remove(o); }
	virtual void Notify(){
		list<Observer*>::iterator iter = _observer.begin();
		for(;iter !=_observer.end();iter++)
			(*iter)->Update();
	}
};
//房产中介
class Mediation : public Subject{
private:
	int m_num;
public:
	Mediation(){}
	virtual ~Mediation(){}
	void SetNum(int num){ m_num=num; }
	int GetNum(){ return m_num; }
	void Change(){ Notify(); }
};
//次房产中介
class MMediation : public Observer ,public Mediation{
private:
	char* m_name;// 中介名字
	Mediation* m_mediation;
	int m_num;//新房源数量 
public :
	MMediation(char* name,Mediation* media) : m_name(name),m_mediation(media){}
	virtual ~MMediation(){}
	void Update(){
		cout<<m_name<<"得知了新房源有"<<m_mediation->GetNum()<<"个"<<endl;
		SetNum(m_mediation->GetNum());
		Notify();
	}
};
//客户
class Client : public Observer{
private:
	char* m_name;// 顾客名字
	Mediation* m_mediation;
public :
	Client(char* name,Mediation* media) : m_name(name),m_mediation(media){}
	virtual ~Client(){}
	void Update(){
		cout<<m_name<<"得知了新房源有"<<m_mediation->GetNum()<<"个"<<endl;
	}
};
int main( )
{
	Mediation *mediation1 = new Mediation();//中介A
	MMediation *mediation2 = new MMediation("中介B",mediation1);//中介B
	Observer *client1 = new Client("Jason",mediation1);//属于中介A
	Observer *client2 = new Client("Jom",mediation1);//属于中介A
	Observer *client3 = new Client("Jess",mediation2);//属于中介B
	Observer *client4 = new Client("Jpc",mediation2);//属于中介B
	//建立联系
	mediation1->Attach(client1);
	mediation1->Attach(client2);
	mediation1->Attach(mediation2);
	mediation2->Attach(client3);
	mediation2->Attach(client4);
	cout<<"---------------------------"<<endl;
	cout<<"设置中介中推出新房源数量为2"<<endl;
	mediation1->SetNum(2);
	mediation1->Change();
	cout<<"---------------------------"<<endl;
	cout<<"设置中介中推出新房源数量为3"<<endl;
	mediation1->SetNum(3);
	mediation1->Change();
	delete mediation1;delete mediation2;
	delete client1;delete client2;
	delete client3;delete client4;
	return 0;
}

中介A设置新房源有2个,结果:通知到各个客户和中介以及他的客户新房源有2个。

中介A设置新房源有3个,结果:通知到各个客户和中介以及他的客户新房源有3个。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值