事件订阅者——监听者。
观察者模式是一种订阅机制,当对象事件发生时通知多个观察者。
实例
Publisher.h
#ifndef PUBLISHER_H_
#define PUBLISHER_H_
#include <vector>
#include <iostream>
#include "Subscriber.h"
class Cat {
public:
// 注册观察者
void attach(AbstractObserver* observer) {
observers_.push_back(observer);
}
// 注销观察者
void detach(AbstractObserver* observer) {
for (auto it = observers_.begin(); it !=observers_.end(); it++) {
if (*it == observer) {
observers_.erase(it);
break;
}
}
}
void cry() {
std::cout << "猫叫!" << std::endl;
for (auto ob : observers_) {
ob->response();
}
}
private:
std::vector<AbstractObserver*> observers_;
};
#endif // PUBLISHER_H_
Subscriber.h
#ifndef SUBSCRIBER_H_
#define SUBSCRIBER_H_
class AbstractObserver {
public:
virtual void response() = 0;
};
#endif // SUBSCRIBER_H_
ConcreteSubscriber.h
#ifndef CONCRETE_SUBSCRIBER_H_
#define CONCRETE_SUBSCRIBER_H_
#include <iostream>
#include "Subscriber.h"
// 具体观察者1: 老鼠
class Mouse : public AbstractObserver {
public:
void response() override {
std::cout << "老鼠逃跑" << std::endl;
}
};
// 具体观察者2: 狗
class Dog : public AbstractObserver {
public:
void response() override {
std::cout << "狗追猫" << std::endl;
}
};
#endif // CONCRETE_SUBSCRIBER_H_
main.cpp
#include "Publisher.h"
#include "ConcreteSubscriber.h"
int main() {
// 发布者
Cat cat;
// 观察者
Mouse mouse;
Dog dog;
// 添加订阅关系
cat.attach(&mouse);
cat.attach(&dog);
// 发布消息
cat.cry();
return 0;
}
编译运行:
$g++ -g main.cpp -o observer -std=c++11
$./observer
猫叫!
老鼠逃跑
狗追猫