嵌入式开发中模板方法模式实现

server/2024/9/24 11:00:13/

模板方法模式

模板方法模式(Template Method Pattern)是一种行为设计模式,它在父类中定义了一个算法的框架,允许子类在不改变结构的情况下重写某些步骤。这种模式体现了“封装不变部分,扩展可变部分”的原则,使得算法骨架在父类中得以统一,而具体的实现细节则交由子类根据需要去完成。

实现

在嵌入式开发中,模板方法模式可以用于处理那些具有相似流程但具体操作步骤有所差异的情况,比如各种设备驱动的初始化、数据采集与处理流程等。下面是一个基于C语言的模板方法模式在嵌入式开发中的实际应用例子,假设我们正在设计一组不同类型的传感器接口,它们的读取操作虽然总体流程相同(打开设备、读取数据、关闭设备),但具体实现细节(如寄存器地址、读取命令等)各不相同。

首先,定义一个抽象传感器基类(模板),其中包含一个readData模板方法:

// Sensor.h
#ifndef SENSOR_H
#define SENSOR_H#include <stdint.h>typedef struct _Sensor Sensor;struct _Sensor {void (*init)(Sensor *sensor);     // 初始化传感器void (*cleanup)(Sensor *sensor);  // 清理资源// 模板方法:读取数据的基本流程void (*readData)(Sensor *sensor, uint16_t *data);
};#endif /* SENSOR_H */

接着,为该基类实现通用的初始化和清理函数:

// Sensor.c
#include "Sensor.h"void sensorInit(Sensor *sensor) {// 公共的初始化逻辑(例如:配置GPIO、中断等)sensor->init(sensor);
}void sensorCleanup(Sensor *sensor) {// 公共的清理逻辑(例如:释放资源、禁用中断等)sensor->cleanup(sensor);
}

然后,定义一个具体的传感器子类(如温度传感器),并实现其特有的初始化、清理和数据读取方法:

// TemperatureSensor.h
#include "Sensor.h"typedef struct _TemperatureSensor TemperatureSensor;struct _TemperatureSensor {Sensor base;         // 继承Sensor基类uint8_t deviceAddr;  // 特有的设备地址// ... 其他特有属性
};TemperatureSensor *createTemperatureSensor(uint8_t addr);void destroyTemperatureSensor(TemperatureSensor *tempSensor);// ... 实现其他特有方法// TemperatureSensor.c
#include "TemperatureSensor.h"
#include "I2C.h"  // 假设有一个I2C库用于通信static void temperatureInit(TemperatureSensor *tempSensor) {// 特有的初始化逻辑(例如:配置I2C通信参数、设置工作模式等)
}static void temperatureCleanup(TemperatureSensor *tempSensor) {// 特有的清理逻辑
}static void temperatureReadData(TemperatureSensor *tempSensor, uint16_t *data) {// 特有的读取数据逻辑,通过I2C读取温度传感器数据I2C_start(tempSensor->deviceAddr);I2C_writeReg(TEMP_REG_ADDR);  // 假设 TEMP_REG_ADDR 是温度寄存器地址*data = I2C_readWord();I2C_stop();
}TemperatureSensor *createTemperatureSensor(uint8_t addr) {TemperatureSensor *tempSensor = (TemperatureSensor *) malloc(sizeof(TemperatureSensor));tempSensor->base.init = &temperatureInit;tempSensor->base.cleanup = &temperatureCleanup;tempSensor->base.readData = &temperatureReadData;tempSensor->deviceAddr = addr;return tempSensor;
}void destroyTemperatureSensor(TemperatureSensor *tempSensor) {free(tempSensor);
}

最后,在主程序中使用模板方法来统一调用不同传感器的数据读取操作:

// main.c
#include "Sensor.h"
#include "TemperatureSensor.h"int main() {TemperatureSensor *tempSensor = createTemperatureSensor(0x48);  // 假设温度传感器地址为0x48uint16_t temperatureData;sensorInit((Sensor *) tempSensor);  // 使用通用初始化方法tempSensor->base.readData((Sensor *) tempSensor, &temperatureData);  // 使用模板方法读取数据printf("Temperature: %d\n", temperatureData);sensorCleanup((Sensor *) tempSensor);  // 使用通用清理方法destroyTemperatureSensor(tempSensor);return 0;
}

小结

在这个例子中,Sensor类定义了传感器读取数据的通用流程(模板方法readData),而TemperatureSensor作为子类实现了这个模板方法的具体细节。主程序只需通过Sensor接口来操作不同类型的传感器,无需关心底层实现差异,从而实现了代码的复用和扩展性。


http://www.ppmy.cn/server/13869.html

相关文章

ZeRO论文阅读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为成体系 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Zero 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 1.前言 ①为什么用该技术&…

JRT多服务器同步程序

之前的JRT只部署在一个服务器&#xff0c;实际运用可能会有数台、数十台、或者更多服务器。那么多台服务器就需要程序同步机制。这里借助Rsync同步&#xff0c;但是有个问题是Rsync同步jar之后他不知道是否需要重启站点&#xff0c;为此实现java控制台驱动Rsync&#xff0c;重定…

解决“ImportError: DLL load failed while importing _rust: 找不到指定的程序的问题

运行 scrapy startproject wikiSpider 报错&#xff1a;ImportError: DLL load failed while importing _rust: 找不到指定的程序。 经过尝试 可以更换Python解释器版本来解决 1、点击crtlalts打开设置 点击项目>解释器 选择3.11解释器 &#xff08;我原来报错用的3.9的解…

【MySQL 所遇问题】

【MySQL 所遇问题】 总结&#xff1a;Error Code: 1064.You have an error in your SQL syntax报错解释1&#xff1a;报错解释2处理过程 Error Code&#xff1a;1366 - Incorrect string value:报错解释处理过程 总结&#xff1a; Error Code: 1064 不可见字符。 某些文本处理…

力扣HOT100 - 104. 二叉树的最大深度

解题思路&#xff1a; class Solution {public int maxDepth(TreeNode root) {if (root null) return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) 1;} }

信息收集

信息收集 域名的相关知识 域名的技术指的是一个域名由多少级组成&#xff0c;域名的各个级别被“.”分开&#xff0c;简而言之&#xff0c;有多少个点就是几级域名 顶级域名&#xff1a;.com(商)、.edu(教)、.gov(政)、.mil(军) 一级域名&#xff1a;qq.com 二级域名&#xf…

全世界IT人苦竞业久矣!美国FTC宣布全面废除员工竞业协议

2023 年 1 月&#xff0c;美国联邦贸易委员会&#xff08;FTC&#xff09;发布声明称&#xff0c;拟在全国范围禁止用人单位与雇员签订竞业禁止性条款。当地时间 4 月 23 日&#xff0c;FTC 宣布全面禁止所有员工&#xff08;包括高级管理人员&#xff09;签署新的竞业禁止协议…

更新至2022年上市公司数字化转型数据合集(四份数据合集)

更新至2022年上市公司数字化转型数据合集&#xff08;四份数据合集&#xff09; 一、2000-2022年上市公司数字化转型数据&#xff08;年报词频、文本统计&#xff09; 二、2007-2022年上市公司数字化转型数据&#xff08;年报和管理层讨论&#xff09;&#xff08;含原始数据…