// Demo.cpp : 定义控制台应用程序的入口点。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <list>
using namespace std;
// 抽象的观察者, (监听者)
class Listenner
{
public:
//老师来了 我改怎么办
virtual void onTeacherComming() = 0;
//学生干坏事的方法
virtual void doBadthing() = 0;
};
//抽象的 被观察者, (通知者)
class Notifier
{
public:
//添加观察者的方法
virtual void addListenner(Listenner *listenner) = 0;
//删除观察者的方法
virtual void delListenner(Listenner *listenner) = 0;
//通知所有观察者的方法
virtual void notify() = 0;
};
//具体的观察者
class Student :public Listenner
{
public:
Student(string name, string badthing)
{
this->name = name;
this->badthing = badthing;
}
//老师来了学生该怎么办
virtual void onTeacherComming()
{
cout << "学生" << name << "发现班长给我使眼神了, 停止" << badthing << endl;
cout << "改为写作业" << endl;
}
virtual void doBadthing() {
cout << " 学生 " << name << "目前正在 " << badthing << endl;
}
private:
string name;
string badthing;
};
//具体的通知者(班长)
class Monitor :public Notifier
{
public:
//添加观察者的方法
virtual void addListenner(Listenner *listenner) {
this->l_list.push_back(listenner);
}
//删除观察者的方法
virtual void delListenner(Listenner *listenner) {
this->l_list.remove(listenner);
}
//通知所有观察者的方法
//班长使眼神的方法
virtual void notify() {
//广播信息,让每一个学生都执行各自的重写的onTeacherComming方法
for (list<Listenner *>::iterator it = l_list.begin(); it != l_list.end(); it++) {
(*it)->onTeacherComming();
//在此处如果触发班长的notify()
}
}
private:
list<Listenner *> l_list; //班长手中所有的学生(观察者)
};
int main(void)
{
Listenner *s1 = new Student("张三", "抄作业");
Listenner *s2 = new Student("李四", "打lol");
Listenner *s3 = new Student("王五", " 看李四玩lol");
Notifier *bossXu = new Monitor;
//将所有的学生列表告知通知者,好让通知者进行通知
bossXu->addListenner(s1);
bossXu->addListenner(s2);
bossXu->addListenner(s3);
cout << "教师一片和谐,老师没有来 " << endl;
s1->doBadthing();
s2->doBadthing();
s3->doBadthing();
cout << "班长突然发现老师来了,给学生们使了一个眼神" << endl;
bossXu->notify();
return 0;
}
C++观察者模式代码
最新推荐文章于 2025-10-11 16:25:38 发布
本文通过一个生动的课堂场景,详细解析了观察者模式在C++中的实现方式。故事围绕班长如何通知学生老师即将到来,学生们如何响应这一信号,停止不当行为并开始写作业展开。代码示例清晰地展示了抽象观察者、具体观察者、抽象被观察者和具体被观察者的定义及交互。
2101

被折叠的 条评论
为什么被折叠?



