观察者模式

观察者模式
观察者模式是一种行为型模式,它定义对象间的一种一对多的关系,当一个对象的状态发生改变,依赖于它的对象都得到通知并更新。
使用场景:当一个对象改变需要同时改变其他对象,但又不知道具体有多少对象需要被改变的时候。
例子:

#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(); 
}

运行结果:
在这里插入图片描述

感谢您的浏览。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值