单片机实现的观察者模式

参考考网上的博文,记录下观察者模式

观察者模式(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 */
}

可以看到当传感器数据更新时,其他模块也都同步更新了传感器数据。

其核心在于更新传感器函数中,使用了函数指针,相当于在运行绑定的函数

相关推荐
小莞尔2 小时前
【51单片机】【protues仿真】基于51单片机六路抢答器系统
c语言·单片机·嵌入式硬件·物联网·51单片机
2501_922639583 小时前
率能半导体 SS6622E直流双向马达驱动芯片:20V/2.4A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
stm32·单片机·嵌入式硬件·硬件工程
意法半导体STM324 小时前
【官方原创】LAT6041 STM32MP1x USB OTG FIFO设置
stm32·单片机·嵌入式硬件·mcu·fifo·stm32mp1x
笨笨饿4 小时前
#145 _Codex 三层故障详细排查与修复步骤
开发语言·人工智能·stm32·单片机·嵌入式硬件
深圳老胡4 小时前
STM32C5A3ZG开发板网络接口配置流程详解
笔记·stm32·单片机·代码规范
牧瀬クリスだ5 小时前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
深圳老胡5 小时前
STM32C5A3ZG 开发板调试笔记:USB 复用 ST-Link 与工程生成警告说明
笔记·stm32·单片机·代码规范
QMCY_jason13 小时前
RK3588 usb摄像头 mipi摄像头 hdmi in 调试记录
单片机·嵌入式硬件
国科安芯13 小时前
四重证据,一条逻辑链:商业航天级微控制器MCU抗辐射验证方法学综述——以国科安芯AS32S601为例
人工智能·单片机·嵌入式硬件·mcu·安全·抗辐射
玄芯散人16 小时前
【元婴·100】STM32启动流程:从上电到main()经历了什么
stm32·单片机·嵌入式硬件