学习模式----观察者模式(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
请按任意键继续. . .








原文地址:https://www.cnblogs.com/jiangu66/p/3217865.html