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
请按任意键继续. . .