当前位置:   article > 正文

设计模式之观察者模式(C++)_qt 观察者模式

qt 观察者模式

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、观察者模式是什么?

       观察者模式是一种行为型的软件设计模式,定义对象间的一种一对多的依赖关系,当被观察者状态发生改变时,所有观察者都做出相应改变。Qt中的信号与槽就是一种典型的观察者模式。

       观察者模式的优点:

  1. 耦合双方依赖于抽象,不需要了解具体。
  2. 提供了稳定的信息更新传递机制。
  3. 良好扩展性。

      观察者模式的缺点:

  1. 当观察者过多时,挨个通知观察者消息可能会花费较长时间。
  2. 某个观察者出现卡顿,可能影响整个进程,一般采用异步机制解决,但同时也要注意程序安全。

二、观察者模式

2.1 结构图

       客户端即Main主函数,当被观察者发生变化,所有观察者都进行响应。

2.2 代码示例

       场景描述:十字路口汽车等待红绿灯变化。

  1. //Observer.h
  2. /****************************************************/
  3. #pragma once
  4. #include <iostream>
  5. #include <unordered_map>
  6. #include <vector>
  7. #include <list>
  8. #include <string>
  9. using namespace std;
  10. // 抽象观察者
  11. class Observer
  12. {
  13. public:
  14. // 构造函数
  15. Observer(int num):m_number(num){}
  16. // 更新
  17. virtual void update(bool flag) = 0;
  18. protected:
  19. int m_number;
  20. };
  21. // 抽象主题-被观察者
  22. class Subject
  23. {
  24. public:
  25. // 连接
  26. virtual void attach(Observer* observer) = 0;
  27. // 断连
  28. virtual void detach(Observer* observer) = 0;
  29. // 通知
  30. virtual void notify(bool flag) = 0;
  31. protected:
  32. vector<Observer*> observers;
  33. };
  34. // 具体主题-红绿灯
  35. class TrafficLight : public Subject
  36. {
  37. public:
  38. // 连接
  39. virtual void attach(Observer* observer) {
  40. observers.push_back(observer);
  41. }
  42. // 断连
  43. virtual void detach(Observer* observer) {
  44. for (auto iter = observers.begin(); iter != observers.end();){
  45. if (*iter == observer){
  46. iter = observers.erase(iter);
  47. }
  48. else{
  49. iter++;
  50. }
  51. }
  52. }
  53. // 通知
  54. virtual void notify(bool flag) {
  55. if (flag) {
  56. cout << "绿灯通行。" << endl;
  57. for (auto observer : observers) {
  58. observer->update(flag);
  59. }
  60. }
  61. else {
  62. cout << "红灯停止。" << endl;
  63. for (auto observer : observers) {
  64. observer->update(flag);
  65. }
  66. }
  67. }
  68. };
  69. // 具体观察者-汽车
  70. class Car : public Observer
  71. {
  72. public:
  73. // 构造函数
  74. Car(int num) :Observer(num) {}
  75. // 更新
  76. virtual void update(bool flag) {
  77. if (flag) {
  78. cout << m_number << "号汽车:发动。" << endl;
  79. }
  80. else {
  81. cout << m_number << "号汽车:停止。" << endl;
  82. }
  83. }
  84. };
  1. //main.cpp
  2. /****************************************************/
  3. #include <iostream>
  4. #include <string>
  5. #include "Observer.h"
  6. using namespace std;
  7. int main()
  8. {
  9. // 创建主题对象
  10. Subject *subject = new TrafficLight();
  11. // 创建观察者对象
  12. Observer *observer1 = new Car(1);
  13. Observer *observer2 = new Car(2);
  14. Observer *observer3 = new Car(3);
  15. Observer *observer4 = new Car(4);
  16. // 连接观察者
  17. subject->attach(observer1);
  18. subject->attach(observer2);
  19. subject->attach(observer3);
  20. subject->attach(observer4);
  21. // 绿灯行
  22. subject->notify(true);
  23. // 3号车通过,不需要再观察
  24. subject->detach(observer3);
  25. cout << "3号车已通过。" << endl;
  26. // 红灯停
  27. subject->notify(false);
  28. // 删除
  29. delete subject;
  30. delete observer1;
  31. delete observer2;
  32. delete observer3;
  33. delete observer4;
  34. subject = nullptr;
  35. observer1 = nullptr;
  36. observer2 = nullptr;
  37. observer3 = nullptr;
  38. observer4 = nullptr;
  39. return 0;
  40. }

       程序结果如下。

       红绿灯未亮起绿灯时,有4辆车等候,绿灯通行后,只有3号车通过了,此时3号车不用再观察当前红绿灯状态了,解除绑定;然后红灯亮,其他3辆车继续停车等候。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对观察者模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解观察者模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/677467
推荐阅读
相关标签
  

闽ICP备14008679号