设计模式-观察者模式

#include<iostream>
#include<unordered_map>
#include<list>
using namespace std;

/// <summary>
/// 行为型模式 : 主要关注的是对象之间的通信
/// 
/// Observer
/// 管擦者-监听者模式(发布-订阅模式)设计模式主要关注的是对象的一对多关系
/// 多个对象依赖一个对象,当该对象状态发生变化,依赖其的对象都能接收到对应的通知
/// 
/// 
/// 
/// 比如:一组数据(数据对象)=》 更具数据绘制出的图=》曲线图(对象1),饼状图(对象2
/// 当数据改变,图形也要改变</summary>
/// <returns></returns>

class Observer {
public:
	//处理消息的接口
	virtual void handle(int msgid) = 0;

};
//观察者实例1
class Observer1 :public Observer {
public:
	void handle(int msgid) {
		switch (msgid)
		{
		case 1:
			cout << "Observer1 recv 1 msg!" << endl;
			break;
		case 2:
			cout << "Observer1 recv 2 msg!" << endl;
			break;
		default:
			cout << "Observer1 recv unknow msg!" << endl;
			break;
		}
	}
};
//观察者实例2
class Observer2 :public Observer {
public:
	void handle(int msgid) {
		switch (msgid)
		{
		case 2:
			cout << "Observer1 recv 2 msg!" << endl;
			break;
		case 3:
			cout << "Observer1 recv 3 msg!" << endl;
			break;
		default:
			cout << "Observer1 recv unknow msg!" << endl;
			break;
		}
	}
};

class Subject
{
public:
	//给主题增加观察者对象
	void addObserver(Observer* obser, int msgid) {
		//_subMap[msgid].push_back(obser);  //有msgid就直接添加 没有自己会创建
		auto it = _subMap.find(msgid);
		if (it!= _subMap.end()) {
			it->second.push_back(obser);
		}
		else {
			list<Observer*> lis;
			lis.push_back(obser);
			_subMap.insert({ msgid,lis });
		}

	}
	//主题检测发生改变,通知相应的观察者对象处理事件
	void dispatch(int msgid){
		auto it = _subMap.find(msgid);
		if (it != _subMap.end()) {
			for (Observer* pobser : it->second) {
				pobser->handle(msgid);
			}
		}
	}
private:
	unordered_map<int, list<Observer*>> _subMap;
};

int main() {
	Subject subject;
	Observer* p1 = new Observer1();
	Observer* p2 = new Observer2();

	subject.addObserver(p1, 1);
	subject.addObserver(p1, 2);
	subject.addObserver(p2, 2);
	subject.addObserver(p2, 3);

	int msgid = 0;
	for (;;) {
		cin >> msgid;
		if (msgid == -1) {
			break;
		}
		subject.dispatch(msgid);
	}
	return 0;
}
/*1
Observer1 recv 1 msg!
2
Observer1 recv 2 msg!
Observer1 recv 2 msg!
3
Observer1 recv 3 msg!*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值