参考考网上的博文,记录下观察者模式
观察者模式(Observer Pattern)是一种行为设计模式,其核心在于建立对象间的动态订阅-通知机制。
主要有被观察者和观察者,是一对多的关系。这种模式可用于传感器更新后,其他模块同步更新传感器数据的应用场景
.h文件
c
#ifndef __APP_SENSOR_H
#define __APP_SENSOR_H
#include "stm32f4xx_hal.h"
#include "EventRecorder.h"
#define OBSERVER_MAX_NUM 6
// 观察者回调函数类型
typedef void(*ObserverCallback)(int value);
// 主题(被观察者)
typedef struct
{
ObserverCallback observers[OBSERVER_MAX_NUM];
int count;
int sensor_value;
} SensorSubject;
void sensor_attach(SensorSubject* subject, ObserverCallback callback);
void sensor_set_value(SensorSubject* subject, int value);
void sensorTest(void);
void sensor_attachTest(void);
.c文件
c
#include "app_sensor.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SEGGER_RTT.h"
// 初始化传感器主题
SensorSubject sensor =
{
.observers = {0},
.count =0,
.sensor_value =0
};
// 附加观察者到主题
void sensor_attach(SensorSubject* subject, ObserverCallback callback)
{
if(!subject || !callback)
{
printf("Invalid parameters!\n");
return;
}
if(subject->count >= OBSERVER_MAX_NUM)
{
printf("Observers full!\n");
return;
}
subject->observers[subject->count++] = callback;
}
// 更新传感器值并通知观察者
void sensor_set_value(SensorSubject* subject, int value)
{
if(!subject)
{
printf("Invalid parameters!\n");
return;
}
subject->sensor_value = value;
// 遍历所有观察者进行通知
for(int i = 0; i < subject->count; ++i)
{
if(subject->observers[i])
{
subject->observers[i](subject->sensor_value); //核心
}
}
}
// 观察者1:显示模块
void display_update(int value)
{
printf("[Display] Value: %d\n", value);
}
// 观察者2:日志模块回
void logger_update(int value)
{
printf("[Logger] Value: %d\n", value);
}
// 观察者3:报警模块
void alarm_update(int value)
{
if(value >100)
{
printf("[Alarm] Value %d exceeds limit!\n", value);
}
}
void sensor_attachTest(void)
{
// 注册观察者
sensor_attach(&sensor, display_update);
sensor_attach(&sensor, logger_update);
sensor_attach(&sensor, alarm_update);
}
int lvalue = 50;
void sensorTest(void)
{
// 模拟传感器数据更新
sensor_set_value(&sensor,lvalue);
lvalue++;
}
测试
c
int main(void)
{
int16_t i = 0;
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
/* USER CODE END SysInit */
DWT_Init();
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
sensor_attachTest();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(500);
sensorTest();
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}

可以看到当传感器数据更新时,其他模块也都同步更新了传感器数据。
其核心在于更新传感器函数中,使用了函数指针,相当于在运行绑定的函数