学习模式----观察者模式(3)
3.观察者模式一般是一对多关系,肯定有一个发布者,然后有n(n>=0)个订阅者,即观察者;当发布者有新的信息更新时,订阅者都可以接收到新的信息。
例子:
// Observers.cpp: 主项目文件。 #include "stdafx.h" #include <iostream> #include <list> #include <numeric> #include <algorithm> #include <string> using namespace System; using namespace std; class Observers //观察者 { private: string strOvName; //观察者名称 public: Observers(string strName) { strOvName = strName; } void Update(string strPublisher,string strMesg) //得到更新信息接口 { cout<<strOvName<< " get Mesg from "<<strPublisher<<"====:"<<strMesg<<endl; } }; public class Publish //发布者 { private: list<Observers*> observersList; //收集观察者列表 string strNewMesg; //新的信息 string strName; //发布者名称 public: Publish(string publishName) { strName = publishName; } void SetNewMesg(string strMesg) //发布新信息 { strNewMesg = strMesg; } void Notify() //通知观察者 { list<Observers*>::iterator iter = observersList.begin(); for(; iter != observersList.end(); iter++) //遍历列表,给所有观察者发送更新的信息 { (*iter)->Update(strName,strNewMesg); } } void AddObservers(Observers *observer) //添加观察者 { observersList.push_back(observer); } void DelObservers(Observers *observer) //删除观察者 { observersList.remove(observer); } }; int main(array<System::String ^> ^args) { Publish *publish = new Publish("北京气象台"); Observers *ov1 = new Observers("Wyz1"); Observers *ov2 = new Observers("Wyz2"); publish->AddObservers(ov1); //注册 publish->AddObservers(ov2); publish->SetNewMesg("北京明日2013-07-25天气:晴 0度 微风"); publish->Notify(); cout<<endl<<endl; publish->DelObservers(ov1); //ov1取消订阅 Observers *ov3 = new Observers("Wyz3"); publish->AddObservers(ov3); publish->SetNewMesg("北京明日2013-07-26天气:晴 100度 狂风"); publish->Notify(); cout<<"wyz"<<endl; system("pause"); return 0; }
运行效果:
Wyz1 get Mesg from 北京气象台====:北京明日2013-07-25天气:晴 0度 微风
Wyz2 get Mesg from 北京气象台====:北京明日2013-07-25天气:晴 0度 微风
Wyz2 get Mesg from 北京气象台====:北京明日2013-07-26天气:晴 100度 狂风
Wyz3 get Mesg from 北京气象台====:北京明日2013-07-26天气:晴 100度 狂风
wyz
请按任意键继续. . .