嵌入式C设计模式 - 观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
1.观察者模式解决一对多的问题,例如一个模块发生改变时,要通知其他的模块;
2.被观察者(observable)/主题(subject)中包含所有的观察者(observer);
3.观察者通过被观察者提供的接口(addObserver)添加自己到被观察者的观察者列表中;
4.观察者提供一个 update 接口供被观察者调用,已便在发生改变时通知观察者。
5.避免观察者和被观察者循环应用导致系统崩溃。
observer.h
1 #ifndef __OBSERVER_H
2 #define __OBSERVER_H
3
4 typedef struct subject Subject;
5 typedef struct observer Observer;
6
7 struct subject {
8 Observer *observer_list;
9 void (*add_observer)(Subject *sub,Observer *obs);
10 void (*delete_observer)(Subject *sub,Observer *obs);
11 int (*count_observers)(Subject *sub);
12 void (*notify_observer)(Subject *sub,Observer *obs,void *arg);
13 void (*notify_all_observers)(Subject *sub,void *arg);
14 };
15
16 struct observer {
17 void (*update)(Observer *obs,Subject *sub,void *arg);
18 Observer *next;
19 };
20
21 void subjectInit(Subject *sub);
22
23 void observerInit(Observer *obs);
24
25 #endif
observer.c
1 #include <stddef.h>
2 #include "observer.h"
3
4 static void
5 _subjectAddObserver(Subject *sub,Observer *obs)
6 {
7 Observer *_obs = sub->observer_list;
8 obs->next = NULL;
9
10 if(_obs == NULL) {
11 sub->observer_list = obs;
12 return;
13 }
14
15 while(_obs->next != NULL)
16 _obs = _obs->next;
17
18 _obs->next = obs;
19 }
20
21 static void
22 _subjectDeleteObserver(Subject *sub,Observer *obs)
23 {
24 Observer *_obs = sub->observer_list;
25
26 if(_obs == NULL) return;
27
28 if(_obs == obs) {
29 sub->observer_list = _obs->next;
30 return;
31 }
32
33 while(_obs->next != NULL) {
34 if(_obs->next == obs) {
35 _obs->next = obs->next;
36 return;
37 }
38
39 _obs = _obs->next;
40 }
41 }
42
43 static int
44 _subjectCountObservers(Subject *sub)
45 {
46 int cnt = 0;
47 Observer *_obs = sub->observer_list;
48
49 while(_obs != NULL) {
50 cnt ++;
51 _obs = _obs->next;
52 }
53
54 return cnt;
55 }
56
57 static void
58 _subjectNotifyObserver(Subject *sub,Observer *obs,void *arg)
59 {
60 obs->update(obs,sub,arg);
61 }
62
63 static void
64 _subjectNotifyAllObservers(Subject *sub,void *arg)
65 {
66 Observer *_obs = sub->observer_list;
67
68 while(_obs != NULL) {
69 _obs->update(_obs,sub,arg);
70 _obs = _obs->next;
71 }
72 }
73
74 void
75 subjectInit(Subject *sub)
76 {
77 sub->observer_list = NULL;
78 sub->add_observer = _subjectAddObserver;
79 sub->delete_observer = _subjectDeleteObserver;
80 sub->count_observers = _subjectCountObservers;
81 sub->notify_observer = _subjectNotifyObserver;
82 sub->notify_all_observers = _subjectNotifyAllObservers;
83 }
84
85 static void
86 _observerUpdate(Observer *obs,Subject *sub,void *arg)
87 {
88 (void)obs;
89 (void)sub;
90 (void)arg;
91
92 /** You should override the update function **/
93 while(1) {
94 ;
95 }
96 }
97
98 void
99 observerInit(Observer *obs)
100 {
101 obs->update = _observerUpdate;
102 obs->next = NULL;
103 }
实体观察者类
1 struct observerExtend {
2 Observer obs;
3 Subject *sub;
4 int id;
5 };
6
7 typedef struct observerExtend ObserverExtend;
8
9 void obExtdinit(ObserverExtend *extd);
1 #include <stdio.h>
2 #include "observer_extend.h"
3
4 static void
5 update(Observer *obs,Subject *sub,void *arg)
6 {
7 ObserverExtend *extd = (ObserverExtend *)obs;
8 printf("observer %d, arg %d\r\n",extd->id, arg);
9 }
10
11 void
12 obExtdinit(ObserverExtend *extd)
13 {
14 observerInit(&extd->obs);
15 extd->obs.update = update;
16 extd->sub->add_observer(extd->sub, &extd->obs);
17 }
嵌入式C设计模式 - 观察者模式的更多相关文章
- 18. 星际争霸之php设计模式--观察者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- js设计模式-观察者模式
定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...
- 【设计模式】Java设计模式 - 观察者模式
[设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...
- 【学习笔记】C/C++ 设计模式 - 观察者模式
前言 估计 2020 年写应用程序的机会比较多,之前一直在做嵌入式驱动程序和Android系统定制方面的工作,在应用程序方面积累的不是很多,因此迫切需要多学学应用编程这方面的知识. 之前在写小的应用程 ...
- [Head First设计模式]山西面馆中的设计模式——观察者模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...
- javascript 设计模式-----观察者模式
观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...
- c#设计模式-观察者模式
Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...
- JAVA 设计模式 观察者模式
用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...
随机推荐
- 【Linux SPI】RFID RC522 设备驱动
一.概述 MFRC522 支持 SPI.I2C.UART 接口,我在某宝上购买了一个 SPI 接口的 RC522 模块.此笔记主要要是通过 RC522 模块学习 linux 中的 SPI 驱动,方便今 ...
- 使用 FPM 将源码包转化为rpm包(技巧)
使用 FPM 将源码包转化为rpm包 1.支持的源类型包 dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包 rpm: 对rpm进行转换 gem: 对r ...
- Mybatis-plus中通用mapper的CRUD(增、删、改、查)操作封装BaseMapper和IService(最详细)
使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及 ...
- 常用ansible命令梳理
命令的具体格式 : ansible <host-pattern> [-f forks] [-m module_name] [-a args] 场景 命令 查询线上所有机器某个文件的含有某个 ...
- 使用async实现多个请求并发
// 写法一 let [cache, cache2] = await Promise.all([cachePromise, cachePromise2]); // 写法二 let Promise= c ...
- 【SSO单点系列】(10):CAS4.0 之 https证书
来源: http://m.blog.csdn.net/zrk1000/article/details/51166603 http://blog.csdn.net/zhurhyme/article/de ...
- vxWidgets(一):初识
wxWidgets 和 QT 之间的选择 跨平台的C++ GUI工具库很多,可是应用广泛的也就那么几个,Qt.wxWidgets便是其中的翘楚这里把GTK+排除在外,以C实现面向对象,上手相当困难,而 ...
- kubeshpere 相关配置
1.配置maven镜像仓库 1.1.查找ks-devops-agent 平台管理 -> 集群管理 -> 配置中心 -> 配置 -> 检索 ks-devops-agent 1.2 ...
- zzul1074_Java
package com.ittrash;import java.util.Scanner;public class zzul1074 { public static void main(String[ ...
- 使用NSIS打包软件
平台和所需软件 平台: Windows 使用软件: NSIS https://nsis.sourceforge.io/Download HM NIS Edit https://sourceforge. ...