单片机实现的观察者模式

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

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

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

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

相关推荐
古译汉书3 小时前
【IoT死磕系列】Day 9:架构一台“自动驾驶物流车”,看8种协议如何协同作战
网络·arm开发·单片机·物联网·tcp/ip·架构·自动驾驶
FreakStudio5 小时前
小作坊 GitHub 协作闭环:fork-sync-dev-pr-merge 实战指南
python·单片机·嵌入式·面向对象·电子diy
cmpxr_10 小时前
【单片机】位域非原子写的风险
单片机·嵌入式硬件
恒森宇电子有限公司11 小时前
南麟LN1151 超低静态功耗 CMOS 低压差线性稳压器 多种封装形式
单片机·嵌入式硬件
九鼎创展科技13 小时前
国产高性能 MCU 开发板新标杆:PICO2 主板深度解析
单片机·嵌入式硬件
LCG元13 小时前
STM32实战:基于STM32F103的LCD1602液晶屏(并口/模拟时序)驱动
stm32·单片机·嵌入式硬件
可乐鸡翅好好吃14 小时前
从四个 ble_evt_handler 看 Nordic BLE 架构:模块化解耦与优先级控制
单片机·嵌入式硬件
三佛科技-1873661339715 小时前
LPK8717省外围无需启动电阻,12W自供电PSR控制芯片恒压恒流方案
单片机·嵌入式硬件
陶瓷好烦15 小时前
智能编码助手:VSCode+Keil+Kilo Code打造自然语言编程环境
vscode·stm32·单片机
liuluyang53015 小时前
DW_apb_timers 寄存器简介
stm32·单片机·嵌入式硬件·dw timer