行为型模式-观察者模式

65 阅读1分钟

行为型模式:主要关注的是对象之间的通信

观察者-监听者模式(发布-订阅模式):主要关注的是对象的一对多的关系,也就是多个对象依赖一个对象,当该对象的状态发生变化时,其他对象能都接收到相应的通知。

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

class Observer {
public:
	virtual void handle(int msgid) = 0;
};

class Observer1 : public Observer {
public:
	void handle(int msgid) {
		switch (msgid) {
		case 1:
			cout << "ob1 recv msg1" << endl;
			break;
		default:
			break;
		}
	}
};

class Observer2 : public Observer {
public:
	void handle(int msgid) {
		switch (msgid) {
		case 2:
			cout << "ob2 recv msg2" << endl;
			break;
		default:
			break;
		}
	}
};

class Subject {
public:
	void addObserver(Observer* obser, int msgid) {
		auto it = m_subs.find(msgid);
		if (it != m_subs.end()) {
			it->second.push_back(obser);
		}
		else {
			list<Observer*> li;
			li.push_back(obser);
			m_subs.insert({ msgid, li });
		}
	}
	// 主题发生变化
	void dispatch(int msgid) {
		auto it = m_subs.find(msgid);
		if (it != m_subs.end()) {
			for (Observer* ptr : it->second) {
				ptr->handle(msgid);
			}
		}
	}
private:
	unordered_map<int, list<Observer*>> m_subs;
};

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

	sub.addObserver(p1, 1);
	sub.addObserver(p2, 2);

	int msgid = 0;
	for (;;) {
		cin >> msgid;
		if (msgid == -1)
			break;
		sub.dispatch(msgid);
	}
}