观察者模式
观察者模式是一种行为型模式,它定义对象间的一种一对多的关系,当一个对象的状态发生改变,依赖于它的对象都得到通知并更新。
使用场景:当一个对象改变需要同时改变其他对象,但又不知道具体有多少对象需要被改变的时候。
例子:
#include <iostream>
#include <list>
using namespace std;
// 抽象的学生 抽象的观察者
class AbstractStudent
{
public:virtual void Update() = 0;
};
// 具体观察者A
class StudentA :public AbstractStudent
{
public:
StudentA() { cout << "学生A正在睡觉..." << endl; }
virtual void Update() { cout << "学生A停止睡觉...开始学习" << endl; }
};
// 具体观察者B
class StudentB :public AbstractStudent
{
public:
StudentB() { cout << "学生B正在玩手机..." << endl; }
virtual void Update() { cout << "学生B停止玩手机...开始学习" << endl; }
};
// 具体观察者C
class StudentC :public AbstractStudent
{
public:
StudentC() { cout << "学生C正在听歌..." << endl; }
virtual void Update() { cout << "学生C停止听歌...开始学习" << endl; }
};
// 具体观察者D
class StudentD :public AbstractStudent
{
public:
StudentD() { cout << "学生D正在看小说..." << endl; }
virtual void Update() { cout << "学生D停止看小说...开始学习" << endl; }
};
// 观察目标抽象
class AbstractTeacher
{
public:
virtual void addStudent(AbstractStudent*student) = 0; // 添加观察者
virtual void deleteStudent(AbstractStudent*student) = 0; // 删除观察者
virtual void notify() = 0; // notify 通知观察者
};
// 具体的观察目标
class Teacher :public AbstractTeacher
{
public:
// 添加观察者
virtual void addStudent(AbstractStudent*student) { pStudentList.push_back(student); };
// 删除观察者
virtual void deleteStudent(AbstractStudent*student) { pStudentList.remove(student); };
// notify 通知观察者
virtual void notify()
{
for (list<AbstractStudent*>::iterator it = pStudentList.begin();
it != pStudentList.end(); it++)
{
(*it)->Update();
}
};
public: list<AbstractStudent*> pStudentList; // 观察者列表
};
// 主函数
void main()
{
cout << "铃声响了,上课了..." << endl;
// 创建观察者
AbstractStudent * studentA = new StudentA();
AbstractStudent * studentB = new StudentB();
AbstractStudent * studentC = new StudentC();
AbstractStudent * studentD = new StudentD();
// 创建观察目标
AbstractTeacher * teacher = new Teacher;
// 添加观察者
teacher->addStudent(studentA);
teacher->addStudent(studentB);
teacher->addStudent(studentC);
teacher->addStudent(studentD);
cout << "studentC 突然离开教室..." << endl;
// 删除观察者
teacher->deleteStudent(studentC);
cout << "老师来了...通知其他学生进入学习状态..." << endl;
// 通知观察者
teacher->notify();
}
运行结果:
感谢您的浏览。