#include #include

using namespace std;

class Object; class Observe { public: Observe(Object *obj = nullptr) : m_pObj(obj) {} void careObj(Object *obj) { m_pObj = obj; } virtual void update() = 0; protected: Object *m_pObj; };

class Object { public: void addObserve(Observe *obs) { m_lst.push_back(obs); } void delObserve(Observe *obs) { m_lst.remove(obs); } void notify() { for(const auto &obs : m_lst) { obs->update(); } } int state; list<Observe *> m_lst; };

class Student : public Observe { public: Student(Object *obj = nullptr) { m_pObj = obj; } virtual void update() { int state = m_pObj->state; if(0 == state) { cout << 'study' << endl; }else { cout << 'play game' << endl; } } };

class Teacher : public Object { public: };

int main() { Teacher jack; Student tom(&jack); Student zs; zs.careObj(&jack); jack.addObserve(&tom); jack.addObserve(&zs); jack.state = 1; jack.delObserve(&zs); jack.notify(); return 0; } // 解释每行代码内容: // 1. #include <iostream>: 包含输入输出流的头文件。 // 2. #include <list>: 包含列表容器的头文件。 // 3. using namespace std;: 使用标准命名空间。 // 4. class Object;: 声明一个Object类。 // 5. class Observe: 定义一个名为Observe的观察者类。 // 6. public:: 公共访问权限。 // 7. Observe(Object *obj = nullptr): 观察者类的构造函数,参数为一个Object指针,默认值为nullptr。 // 8. m_pObj(obj): 将构造函数参数赋值给成员变量m_pObj。 // 9. void careObj(Object *obj): 定义一个名为careObj的成员函数,参数为一个Object指针。 // 10. m_pObj = obj;: 将函数参数赋值给成员变量m_pObj。 // 11. virtual void update() = 0;: 定义一个名为update的纯虚函数。 // 12. protected:: 保护访问权限。 // 13. Object *m_pObj;: 定义一个名为m_pObj的Object指针。 // 14. class Object: 定义一个名为Object的类。 // 15. public:: 公共访问权限。 // 16. void addObserve(Observe *obs): 定义一个名为addObserve的成员函数,参数为一个Observe指针。 // 17. m_lst.push_back(obs);: 将obs指针添加到m_lst列表容器的末尾。 // 18. void delObserve(Observe *obs): 定义一个名为delObserve的成员函数,参数为一个Observe指针。 // 19. m_lst.remove(obs);: 从m_lst列表容器中移除obs指针。 // 20. void notify(): 定义一个名为notify的成员函数。 // 21. for(const auto &obs : m_lst): 遍历m_lst列表容器中的每个元素,使用obs作为迭代变量。 // 22. obs->update();: 调用obs指针所指对象的update函数。 // 23. int state;: 定义一个名为state的整型变量。 // 24. list<Observe *> m_lst;: 定义一个名为m_lst的Observe指针列表容器。 // 25. class Student : public Observe: 定义一个名为Student的类,继承自Observe类。 // 26. public:: 公共访问权限。 // 27. Student(Object *obj = nullptr): Student类的构造函数,参数为一个Object指针,默认值为nullptr。 // 28. m_pObj = obj;: 将构造函数参数赋值给成员变量m_pObj。 // 29. virtual void update(): 定义一个名为update的虚函数。 // 30. int state = m_pObj->state;: 将m_pObj指针所指对象的state成员变量的值赋给局部变量state。 // 31. if(0 == state): 如果state等于0。 // 32. cout << 'study' << endl;: 输出'study'并换行。 // 33. else: 否则。 // 34. cout << 'play game' << endl;: 输出'play game'并换行。 // 35. class Teacher : public Object: 定义一个名为Teacher的类,继承自Object类。 // 36. public:: 公共访问权限。 // 37. Teacher jack;: 创建一个名为jack的Teacher对象。 // 38. Student tom(&jack);: 创建一个名为tom的Student对象,并将jack的地址作为参数传递给构造函数。 // 39. Student zs;: 创建一个名为zs的Student对象。 // 40. zs.careObj(&jack);: 将jack的地址作为参数传递给zs对象的careObj函数。 // 41. jack.addObserve(&tom);: 将tom对象的地址作为参数传递给jack对象的addObserve函数。 // 42. jack.addObserve(&zs);: 将zs对象的地址作为参数传递给jack对象的addObserve函数。 // 43. jack.state = 1;: 将jack对象的state成员变量赋值为1。 // 44. jack.delObserve(&zs);: 将zs对象的地址作为参数传递给jack对象的delObserve函数。 // 45. jack.notify();: 调用jack对象的notify函数。 // 46. return 0;: 返回0,表示程序正常结束。

C++ 观察者模式实现示例:学生和老师的互动

原文地址: https://www.cveoy.top/t/topic/qyfE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录