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

模板方法模式

模板方法模式(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);  // 假设温度传感器地址为0x48
    uint16_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.mfbz.cn/a/571953.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈免杀下的持久化

文章目录 前记注册表计划任务COM劫持后记reference 前记 实战中持久化的手段常用的就是加服务、添改注册表、加计划任务、劫持等&#xff0c;这里探索c/c下的维权免杀 注册表 用户级 \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run \HKEY_CURRENT_USER…

正则表达式.java

正则表达式的作用&#xff1a; ①可以校验字符串是否满足一定的规则&#xff0c;并用来校验数据格式的合法性&#x1f9f8; &#x1f9e9;[]:只能是括号里的字符 &#x1f9e9;[^]&#xff1a;除了括号里的字符 &#x1f9e9;[- -]:表示两段范围&#xff0c;满足其一即可 &a…

Linux系统内存持续飙高,如何排查

若一台服务器内存使用率持续处于高峰值&#xff0c;可能会导致响应慢&#xff08;如&#xff1a;ssh操作卡顿、用户访问失败或超时等&#xff09; 1.查看系统内存使用情况 free -m 2.查看哪些进程内存占用比较高 top 或htop 观察进程PID和命令确认是哪一个进程占用内存较高 …

Mogdb 5.0新特性:SQL PATCH绑定执行计划

前言 熟悉Oracle的dba都知道&#xff0c;生产系统出现性能问题时&#xff0c;往往是SQL走错了执行计划&#xff0c;紧急情况下&#xff0c;无法及时修改应用代码&#xff0c;dba可以采用多种方式针对于某类SQL进行执行计划绑定&#xff0c;比如SQL Profile、SPM、SQL Plan Base…

【prometheus】监控MySQL并实现可视化

目录 一、概述 1.1下载解压mysqld_exporter 1.2创建MySQL授权用户 1.3配置my.cnf 1.4启动mysqld_exporter 1.5prometheus配置修改 二、Grafana展示 【Prometheus】概念和工作原理介绍_prometheus工作原理 【Prometheus】k8s集群部署node-exporter 【prometheus】k8s集…

Python | Leetcode Python题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; class Solution:def rotate(self, matrix: List[List[int]]) -> None:n len(matrix)# 水平翻转for i in range(n // 2):for j in range(n):matrix[i][j], matrix[n - i - 1][j] matrix[n - i - 1][j], matrix[i][j]# 主对角线翻转for …

验证二叉搜索树 - LeetCode 热题 43

大家好&#xff01;我是曾续缘&#x1f618; 今天是《LeetCode 热题 100》系列 发车第 43 天 二叉树第 8 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜…

【Linux】什么是yum?--linux中的软件包管理器详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

UML——类图详解

目录 1. 前言 2. 类图概述 3. 类图表示法 3.1 类的表示方式 3.2 类与类之间关系的表示方式 (1)继承(泛化)关系 (2)实现关系 (3)依赖关系 (4)一般关联关系 (5)聚合关系 (6)组合关系 1. 前言 UML全称(Unified Modeling Language)&#xff0c;译为统一建模语言&#x…

FRPC+PHP+MYSQL+APACHE2=个人网站

应用背景有公网需求,但是又不想去买又贵又低配置的服务器,然后方案就应运而生 frp/README_zh.md at dev fatedier/frp (github.com) 在这里, FRPC作为内网穿透服务, PHPMYSQLAPACHE2,作为网站搭建,具体细节不细讲, 但是在我的/var/www/html下面 linaroHinlink:/var/www/h…

代码随想录算法训练营Day8 | ● 344.反转字符串● 541. 反转字符串II● 54.替换数字● 151.翻转字符串里的单词● 55.右旋转字符串

&#xff08;记得重学&#xff09; ● 344.反转字符串 题目&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一…

【蓝桥杯2025备赛】集合求和

集合求和 题目描述 给定一个集合 s s s&#xff08;集合元素数量 ≤ 30 \le 30 ≤30&#xff09;&#xff0c;求出此集合所有子集元素之和。 输入格式 集合中的元素&#xff08;元素 ≤ 1000 \le 1000 ≤1000&#xff09; 输出格式 s s s 所有子集元素之和。 样例 #1 …

JAVAEE—HTTP

文章目录 HTTP导读HTTP解析HTTP的格式分析环境准备 HTTP请求格式首行headerHostContent-LengthContent-TypeUser-Agent (简称 UA)RefererCookie 空行body HTTP响应格式认识HTTP的方法POST方法POST和GET的区别第一&#xff1a;用处第二&#xff1a;传递数据第三&#xff1a;GET不…

【漏洞复现】通天星CMSV6车载监控平台Logger未授权漏洞

漏洞描述&#xff1a; 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队&#xff0c;专注于为定位、无线视频终端产品提供平台服务&#xff0c;通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频…

Sylar C++高性能服务器学习记录05 【线程模块-知识储备篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频&#xff0c;还有幸加了sylar本人的wx&#xff0c;由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去&#xff0c;每每想起倍感惋惜。恰…

Android IPC | Android多进程模式

前 言 关于Android的进程间通信&#xff08;即IPC&#xff09;有很多种方式&#xff0c;比如我们常用的AIDL、Socket等&#xff0c;而其中最重要而且最需要掌握的就是AIDL的使用和原理&#xff0c;简单来说它是通过Binder实现的。 关于Binder的知识点非常多&#xff0c;当我们…

libtorrent - 安装小记

文章目录 官方文档&#xff1a;libtorrent python binding http://libtorrent.org/python_binding.html 1、下载代码 建议使用&#xff1a; git clone --recurse-submodules https://github.com/arvidn/libtorrent.git如果在 github web 界面下载代码&#xff0c;build 的时候…

sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步 ⏱️ 创作时…

FL Studio21.2中文破解版下载2024最新五月破解步骤教程

FL Studio 21.2.3.4004中文版 中文别名水果编曲软件&#xff0c;是一款全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室&#xff0c;它为您提供了一个集成的开发环境&#xff0c;使用起来非常简单有效&#xf…

MATLAB命令

MATLAB是一个用于数值计算和数据可视化的交互式程序。您可以通过在命令窗口的MATLAB提示符 ‘>>’ 处键入命令来输入命令。 在本节中&#xff0c;我们将提供常用的通用MATLAB命令列表。 用于管理会话的命令 MATLAB提供了用于管理会话的各种命令。下表提供了所有此类命令…
最新文章