网上的观察者模式学习资料很多,以下是我的想法,如果有更好的方法,请提出一些好的建议,谢谢,
============================================
观察者模式,主要是两个部分
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个。