观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
构成:
- 抽象主题(Subject)角色:抽象主题角色提供维护一个观察者对象聚集的操作方法,对聚集的增加、删除等。
- 具体主题(ConcreteSubject)角色:将有关状态存入具体的观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色负责实现抽象主题中聚集的管理方法。
- 抽象观察者(Observer)角色:为具体观察者提供一个更新接口。
- 具体观察者(ConcreteObserver)角色:存储与主题相关的自洽状态,实现抽象观察者提供的更新接口。
#include <iostream>
#include <list>
using std::list;
// 抽象观察者角色
class student {
public:
virtual void onteacher() = 0;
};
// 具体观察者角色1
class LiSi: public student {
virtual void onteacher() {
cp();
}
void cp() {
std::cout << "zs cp" << std::endl;
}
};
// 具体观察者角色2
class WangWu: public student {
virtual void onteacher() {
cp();
}
void cp() {
std::cout << "ww cp" << std::endl;
}
};
// 抽象主题角色
class A {
virtual void addlisten(student* s) = 0;
virtual void remove(student* s) = 0;
virtual void on() = 0;
};
// 具体主题角色
class ZhangSan: public A {
private:
list<student*> m_stu;
public:
// 把观察者放入一个容器中
void addlisten(student* s) {
m_stu.push_back(s);
}
// 把观察者取出容器中
void remove(student* s) {
m_stu.remove(s);
delete s;
}
// 满足条件,通知他们
void on() {
auto it = m_stu.begin();
for (; it != m_stu.end(); it++) {
(*it)->onteacher();
}
}
};
int main() {
ZhangSan zs;
LiSi ls;
WangWu ww;
zs.addlisten(&ls);
zs.addlisten(&ww);
zs.on();
return 0;
}