C++ 观察者模式实现示例:学生和老师的互动
#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,表示程序正常结束。
原文地址: https://www.cveoy.top/t/topic/qyfE 著作权归作者所有。请勿转载和采集!