当前位置:   article > 正文

C 观察者模式 Demo

C 观察者模式 Demo

目录

一、基础描述

二、Demo 


        最近需要接触到 MySQL 半同步插件,发现其中用到了观察者模式,之前没在 C 中用过,遂好奇心驱使下找了找资料,并写了个 Demo。

一、基础描述

        观察者设计模式(Observer Pattern),又称发布-订阅模式(Publish-Subscribe Pattern),是一种行为设计模式。它定义了一种一对多的依赖关系,使得当一个对象(主题或发布者)的状态发生变化时,所有依赖于它的对象(观察者或订阅者)都会得到通知并自动更新。这种模式在软件开发中非常有用,特别是在实现事件处理系统、数据监控系统等方面。

观察者设计模式的主要角色

  • Subject(主题/发布者):
    • 又称被观察者,负责管理观察者列表,并向观察者发送通知。
    • 提供接口让观察者可以注册自己(订阅)和注销自己(取消订阅)。
    • 在状态发生变化时,遍历观察者列表,通知所有注册的观察者。
  • Observer(观察者/订阅者):
    • 订阅主题的更新事件,并执行相应的更新操作。
    • 定义一个接口,以便在得到主题的通知时更新自己。
  • ConcreteSubject(具体主题):
    • 具体的主题实现,包含观察者列表,并在状态发生变化时通知观察者。
  • ConcreteObserver(具体观察者):
    • 具体的观察者实现,处理来自主题的更新事件。

二、Demo 

        注册两个观察者。发布者状态变量发生修改后,通知观察者,观察者进行响应。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct _observer obs_observer;
  5. typedef struct _subject obs_subject;
  6. typedef void (*ProcessFun_1)(obs_subject *, obs_observer *);
  7. typedef void (*ProcessFun_2)(obs_subject *);
  8. // observer struct
  9. struct _observer {
  10. char name[50];
  11. void (*update)(obs_subject *, obs_observer *);
  12. };
  13. // env struct
  14. struct _subject {
  15. int state;
  16. int observer_num;
  17. obs_observer **observers;
  18. ProcessFun_1 attach;
  19. ProcessFun_1 detach;
  20. ProcessFun_2 notify;
  21. ProcessFun_2 destroy;
  22. };
  23. void init_subject(obs_subject *subject, ProcessFun_1 attach, ProcessFun_1 detach, ProcessFun_2 notify, ProcessFun_2 destroy)
  24. {
  25. subject->state = 0;
  26. subject->observer_num = 0;
  27. subject->observers = NULL;
  28. subject->attach = attach;
  29. subject->detach = detach;
  30. subject->notify = notify;
  31. subject->destroy = destroy;
  32. }
  33. void init_observer(obs_observer *observer, const char *name)
  34. {
  35. strcpy(observer->name, name);
  36. observer->update = NULL;
  37. }
  38. void attach(obs_subject *subject, obs_observer *observer)
  39. {
  40. if ( subject->observer_num == 0 )
  41. {
  42. subject->observers = (obs_observer **)malloc(sizeof(obs_subject *));
  43. }
  44. else
  45. {
  46. subject->observers = (obs_observer **)realloc(subject->observers, (subject->observer_num + 1) * sizeof(obs_observer *));
  47. }
  48. subject->observers[subject->observer_num++] = observer;
  49. }
  50. void detach(obs_subject *subject, obs_observer *observer)
  51. {
  52. int i = 0;
  53. for ( i = 0; i < subject->observer_num; i++ )
  54. {
  55. if ( subject->observers[i] == observer )
  56. {
  57. break;
  58. }
  59. }
  60. if ( i < subject->observer_num )
  61. {
  62. subject->observer_num--;
  63. subject->observers[i] = subject->observers[subject->observer_num];
  64. subject->observers = (obs_observer **)realloc(subject->observers, subject->observer_num * sizeof(obs_observer *));
  65. }
  66. }
  67. void concrete_update(obs_subject *subject, obs_observer *observer) {
  68. printf("Observer %s received notification: Subject state is now %d\n\n", observer->name, subject->state);
  69. }
  70. void notify(obs_subject *subject)
  71. {
  72. for ( int i = 0; i < subject->observer_num; i++ )
  73. {
  74. if (subject->observers[i]->update != NULL)
  75. {
  76. subject->observers[i]->update(subject, subject->observers[i]);
  77. }
  78. }
  79. }
  80. void destroy_subject(obs_subject *subject)
  81. {
  82. if ( subject->observers != NULL )
  83. {
  84. free(subject->observers);
  85. }
  86. }
  87. int main(int argc, char **args)
  88. {
  89. // init observer
  90. obs_observer m_observer_1, m_observer_2;
  91. init_observer(&m_observer_1, "observer_1");
  92. init_observer(&m_observer_2, "observer_2");
  93. m_observer_1.update = concrete_update;
  94. m_observer_2.update = concrete_update;
  95. // init env
  96. obs_subject m_subject;
  97. init_subject(&m_subject, attach, detach, notify, destroy_subject);
  98. m_subject.attach(&m_subject, &m_observer_1);
  99. m_subject.attach(&m_subject, &m_observer_2);
  100. // process
  101. m_subject.state = 1;
  102. m_subject.notify(&m_subject);
  103. m_subject.state = 2;
  104. m_subject.notify(&m_subject);
  105. // destroy env
  106. m_subject.detach(&m_subject, &m_observer_1);
  107. m_subject.detach(&m_subject, &m_observer_2);
  108. m_subject.destroy(&m_subject);
  109. return 0;
  110. }

--------------- 分界线------------------

--------------- 分界线------------------

--------------- 分界线------------------

观察者设计模式(Observer Pattern),又称发布-订阅模式(Publish-Subscribe Pattern),是一种行为设计模式。它定义了一种一对多的依赖关系,使得当一个对象(主题或发布者)的状态发生变化时,所有依赖于它的对象(观察者或订阅者)都会得到通知并自动更新。这种模式在软件开发中非常有用,特别是在实现事件处理系统、数据监控系统等方面。

观察者设计模式(Observer Pattern),又称发布-订阅模式(Publish-Subscribe Pattern),是一种行为设计模式。它定义了一种一对多的依赖关系,使得当一个对象(主题或发布者)的状态发生变化时,所有依赖于它的对象(观察者或订阅者)都会得到通知并自动更新。这种模式在软件开发中非常有用,特别是在实现事件处理系统、数据监控系统等方面。

观察者设计模式的主要角色
Subject(主题/发布者):
又称被观察者,负责管理观察者列表,并向观察者发送通知。
提供接口让观察者可以注册自己(订阅)和注销自己(取消订阅)。
在状态发生变化时,遍历观察者列表,通知所有注册的观察者。
Observer(观察者/订阅者):
订阅主题的更新事件,并执行相应的更新操作。
定义一个接口,以便在得到主题的通知时更新自己。
ConcreteSubject(具体主题):
具体的主题实现,包含观察者列表,并在状态发生变化时通知观察者。
ConcreteObserver(具体观察者):
具体的观察者实现,处理来自主题的更新事件。

观察者设计模式(Observer Pattern),又称发布-订阅模式(Publish-Subscribe Pattern),是一种行为设计模式。它定义了一种一对多的依赖关系,使得当一个对象(主题或发布者)的状态发生变化时,所有依赖于它的对象(观察者或订阅者)都会得到通知并自动更新。这种模式在软件开发中非常有用,特别是在实现事件处理系统、数据监控系统等方面。

观察者设计模式的主要角色
Subject(主题/发布者):
又称被观察者,负责管理观察者列表,并向观察者发送通知。
提供接口让观察者可以注册自己(订阅)和注销自己(取消订阅)。
在状态发生变化时,遍历观察者列表,通知所有注册的观察者。
Observer(观察者/订阅者):
订阅主题的更新事件,并执行相应的更新操作。
定义一个接口,以便在得到主题的通知时更新自己。
ConcreteSubject(具体主题):
具体的主题实现,包含观察者列表,并在状态发生变化时通知观察者。
ConcreteObserver(具体观察者):
具体的观察者实现,处理来自主题的更新事件。

观察者设计模式(Observer Pattern),又称发布-订阅模式(Publish-Subscribe Pattern),是一种行为设计模式。它定义了一种一对多的依赖关系,使得当一个对象(主题或发布者)的状态发生变化时,所有依赖于它的对象(观察者或订阅者)都会得到通知并自动更新。这种模式在软件开发中非常有用,特别是在实现事件处理系统、数据监控系统等方面。

观察者设计模式的主要角色
Subject(主题/发布者):
又称被观察者,负责管理观察者列表,并向观察者发送通知。
提供接口让观察者可以注册自己(订阅)和注销自己(取消订阅)。
在状态发生变化时,遍历观察者列表,通知所有注册的观察者。
Observer(观察者/订阅者):
订阅主题的更新事件,并执行相应的更新操作。
定义一个接口,以便在得到主题的通知时更新自己。
ConcreteSubject(具体主题):
具体的主题实现,包含观察者列表,并在状态发生变化时通知观察者。
ConcreteObserver(具体观察者):
具体的观察者实现,处理来自主题的更新事件。

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

闽ICP备14008679号