单片机实现的观察者模式

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

观察者模式(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 小时前
在STM32上跑通TinyML
stm32·单片机·嵌入式硬件
iCxhust3 小时前
C#进程管理程序
开发语言·汇编·stm32·单片机·c#·微机原理
SUNNYSPY0016 小时前
AO3402-ASEMI开关电源专用AO3402
单片机
iCxhust6 小时前
MTK8088单板机制作(一)时钟电路
汇编·单片机·嵌入式硬件·微机原理·8088单板机
崇山峻岭之间7 小时前
单片机直流有刷电机速度环PID控制实验
单片机·嵌入式硬件
xiangw@GZ7 小时前
智能锁浮空系统指纹头金属环ESD防护技术分析
单片机·嵌入式硬件
项目題供诗7 小时前
STM32-DMA直接存储器存储(二十)
stm32·单片机·嵌入式硬件
耳朵东先生8 小时前
STM32 开发利器:SEGGER RTT 日志打印与 Shell 实践解析
单片机·嵌入式硬件
振南的单片机世界8 小时前
RS485组网三要素:负载、距离、终端电阻
arm开发·stm32·单片机·嵌入式硬件
小慧10248 小时前
Esp开发工具命令
单片机