单片机实现的观察者模式

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

观察者模式(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 小时前
单片机基础核心知识点汇总(三十四)
单片机·嵌入式硬件
三佛科技-187366133974 小时前
24W-48W隔离双绕组非标自供电芯片LP3718CD(电路原理图)
单片机·嵌入式硬件
geovindu4 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
电子元器件选型哥7 小时前
一文讲清LLC谐振电路工作原理
单片机·嵌入式硬件·硬件工程师·电子元器件·器件选型
ZLG_zhiyuan9 小时前
测试方案 | 从“000”到“111”,高效完成100BASE-TX以太网眼图测试
单片机·嵌入式硬件
H_oRIZoN_10 小时前
Linux入门DAY39(51 单片机入门笔记|最小系统、位运算、处理器、数码管基础梳理)
单片机·嵌入式硬件
12.=0.10 小时前
【电学基础】
单片机·嵌入式硬件
开发笔记-阿牛10 小时前
嵌入式蓝牙开发:AC2005B 芯片技术解析 —— 省晶振设计、13dBm 射频与 Auracast 广播音响开发指南
人工智能·单片机·音视频
单片机仿真设计10 小时前
【proteus仿真】基于 STM32 单片机电梯运行状态监控设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus
Run_Teenage11 小时前
嵌入式:理解I2C通信基本原理
stm32·单片机·嵌入式硬件