学习模式----观察者模式(3)

本文详细阐述了观察者模式的实现方式,并通过一个具体的例子展示了如何使用此模式。包括发布者与观察者之间的交互过程,以及如何进行信息的订阅与取消订阅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值