C 嵌入式系统设计模式 09:硬件适配器模式

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。

本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之二:硬件适配器模式。

硬件适配器模式 (Hardware Adapter Pattern)是一种设计模式,通过增加一层适配器来解决底层硬件设备与应用软件之间的接口不兼容问题。

比如应用层需要的特定接口,但是现有硬件层提供的接口并不能兼容,而你又希望能使用现有的硬件层接口(而不是重写),这时可以用硬件适配器模式在应用层和硬件接口之间进行转换。通过创建硬件适配器的方式来提供需要的接口,而不是重写硬件设备的接口。

摘要

硬件适配器模式提供了一种方式,可以将现有的硬件接口适配成上层应用需要的接口。

在面向对象编程中,适配器模式 (注意不是 硬件适配器模式 )是一种常见的设计模式,用于将一个类的接口转换成客户期望的另一个接口。硬件适配器模式是适配器模式在硬件接口适配方面的具体应用,因此可以看作是适配器模式的直接派生。它们的核心思想都是通过创建一个中间层来转换接口,使得原本不兼容的接口能够协同工作。

问题

在软件开发中,经常会遇到这样的情况:需要使用某个硬件设备,但该设备的接口与软件系统的期望并不完全一致。这时,如果直接修改软件系统的代码来适应硬件接口,可能会导致大量的重构工作,而且在将来更换硬件设备时,又需要再次进行修改。

为了避免这种情况,可以使用硬件适配器模式。该模式通过引入一个适配器来解决接口不匹配的问题。适配器在客户端和硬件之间起到了一个桥梁的作用,它对外提供客户端所期望的接口,而在内部则将客户端的请求转换为硬件接口所能理解的形式。这样,客户端就可以通过适配器与硬件进行交互,而无需关心硬件接口的具体实现细节。

硬件适配器模式的主要优点是提高了软件系统的灵活性和可扩展性。当需要更换硬件设备时,只需更换相应的适配器即可,而无需修改客户端的代码。这大大减少了代码的重构工作,降低了软件系统的维护成本。

模式结构

硬件适配器的模式结构图如下所示。
在这里插入图片描述

在图中,我们可以看到硬件适配器模式的主要组成部分以及它们之间的关系。这个模式是在 硬件代理模式 的基础上进行了扩展,主要增加了一个硬件适配器。硬件适配器的作用是将上层应用期望的接口转换成实际硬件能够理解的接口。

此外,图中还明确显示了上层应用期望硬件支持的 接口。这是非常重要的,因为它确保了上层应用和硬件之间的通信是按照预期的方式进行的。上层应用通过这个接口向硬件发送请求,并接收来自硬件的响应。而硬件适配器则负责将这些请求和响应在上层应用接口和硬件接口之间进行转换。

在面向对象编程(OOP)中,接口(Interface)是一种抽象类型,它是行为的抽象规范,用于规定类的方法,但不包含方法的实现接口定义了一组方法(行为),这些方法在不同的类中可能会有不同的实现。通过这些方法,接口定义了对象之间的一种 契约,即实现接口的类必须提供接口所规定的方法。

接口在面向对象编程中的主要作用是实现 多态性,以及提高软件系统的可扩展性和可维护性。通过接口,我们可以定义一种标准,使得不同的类可以以相同的方式被调用,从而实现代码的复用和模块化

接口通常包含一组方法声明,这些方法都是公开的(public),并且没有方法体(即没有实现)。实现接口的类必须提供接口中所有方法的具体实现。一个类可以实现多个接口,从而继承多个接口的行为规范。

模式详情

适配器应用层

应用层调用一些列服务,实现对硬件的交互。这些服务由“用于应用层的硬件接口”定义,接口规定了上层应用可以从代表硬件的软件模块中获得的行为和功能。

适配器应用层是系统中的一个组成部分,它想要使用硬件设备。但是,由于硬件设备的实现细节和接口可能与上层应用的期望不匹配,因此需要一个适配器来充当中间层。这个适配器实现了上层应用期望的接口,并在内部将上层应用的请求转换为硬件设备能够理解的命令或请求。

通过这种方式,上层应用可以无缝地与代表硬件的软件元素进行交互,而无需关心底层的硬件实现细节。这种抽象层的使用提高了系统的灵活性和可维护性,因为硬件设备的更换或升级不会直接影响到上层应用代码。

硬件适配器

硬件适配器在上层应用和 硬件代理 之间起到一个桥梁的作用,使得两者之间的通信能够顺畅进行,即使它们的服务接口和数据格式存在差异。换言之,上层应用发出的服务请求会被转换成硬件代理所能提供的一系列服务。这个过程可能包括对服务调用的分解,以及对数据的重新格式化和重构。

用于应用层的硬件接口

此接口表示上层应用期望硬件代理提供的服务和参数列表的集合。作为一个接口,它是服务规范的集合,没有具体的实现。在此情况下,实现由硬件适配器类提供。

硬件代理

见 硬件代理 博文。

结果

使用这种模式,不同的 硬件代理 及其相关的硬件设备可以在不同的应用程序中直接使用,同时允许现有的应用程序无需更改即可使用不同的硬件设备。关键在于,适配器提供了连接的“粘合剂”,将硬件代理与应用程序匹配。这意味着为一个应用程序更换硬件设备或在新的应用程序中重用现有的硬件设备将变得更容易、更少出错、更快。

然而,使用这种模式的代价是它增加了一层间接性,因此会略微降低运行时性能。

实现策略

在面向对象编程中,当提到适配器模式(Adapter Pattern)时,我们经常会遇到两种类型的适配器:对象适配器类适配器。这两种适配器都用于解决接口不兼容的问题,但它们的实现方式有所不同。

  • 对象适配器(Object Adapter):对象适配器利用组合(composition)来实现适配。它持有一个被适配对象(Adaptee)的引用,并在需要时将客户端的请求委托给被适配对象。对象适配器可以适配其父类接口(Target)所定义的方法。
  • 类适配器(Class Adapter):类适配器通过继承(inheritance)来实现适配。它继承自被适配对象(通常是通过继承一个具体类而不是接口),同时实现目标接口。类适配器需要重写目标接口中的方法,并在这些方法中调用被适配对象的方法(可能需要做一些转换或适配)。

本书中的硬件适配器模式是适配器模式在硬件接口适配方面的具体应用,本文中的模式结构图描述的是 对象适配器 实现方法。

相关模式

硬件适配器 扩展了 硬件代理模式。硬件代理模式封装了硬件接口细节,但不将服务请求转换为完全不同的请求。硬件适配器模式在上层应用和硬件代理之间增加了一层间接性。这允许不改变上层应用代码的同时,重用可能为其他系统创建的现有硬件代理代码。硬件代理和硬件适配器的实现可以合并,但这会破坏硬件代理的可重用性。

这里的核心思想是,通过引入适配器,我们可以使上层应用与硬件代理之间的交互更加灵活。适配器充当了翻译的角色,将上层应用的请求转换为硬件代理可以理解的形式,或者将硬件代理的响应转换为上层应用可以理解的形式。这样,即使硬件代理是为其他系统创建的,也可以在不修改上层应用代码的情况下进行重用。然而,如果将硬件代理和硬件适配器的实现合并,那么硬件代理的可重用性就会受到损害,因为它将紧密地与特定的上层应用请求和响应格式绑定在一起。

实例

见原书。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/405143.html

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

相关文章

【C语言】程序编译链接详解

目录 一、程序的翻译环境和执行环境 二、编译链接过程 2.1、程序编译过程 2.2、程序编译链接的阶段 2.2.1、预处理 2.2.2、编译 2.2.3、汇编 2.2.4、链接 2.2.5、整体过程 三、运行环境 一、程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不…

odoo16-API(Controller)带有验证访问的接口

odoo16-API(Controller)带有验证访问的接口 目前我使用odoo原生的登录token来验证登陆的有效性 废话不多说直接上代码 # 测试获取session_id import requests class GetOdooData(http.Controller):def getOdooToken(self):# http://localhost:8123访问…

要赢,且不止一次,2024创维汽车势不可挡!

随着除夕钟声的敲响,创维汽车迎来了全新的一年。过往取得的成绩已成为了历史,全新的未来还有待奋斗者们去开创。为辞旧迎新,创维汽车于2月22日及2月23日召开了“新春启航,共谋发展”营销会议,为2024做下全新布局。 创维…

【xss跨站漏洞】xss漏洞利用工具beef的安装

安装环境 阿里云服务器,centos8.2系统,docker docker安装 前提用root用户 安装docker yum install docker 重启docker systemctl restart docker beef安装 安装beef docker pull janes/beef 绑定到3000端口 docker run --rm -p 3000:3000 janes/beef …

【若依(ruoyi)】Java---如何在Apifox上传params参数--延伸--如何在Apifox上传Map类型参数

在使用若依开发过程中写接口的时候想在params中添加参数,但是使用params.key这种形式在后端是接收不到传过来的参数的,于是百般调研(百度),终于找到一个解决办法,就是在参数前后加上%5B和%5D,这两个参数会被编译为"["和"]",于是就对得上了,后端成功接受到参…

基于Java在线宠物店商城系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

【工具】阿莫智能设备之脱机烧录器K202C-1

注意,本文档仅仅是介绍烧录器的资料构成,并非烧录器的说明书,详细请看各对说明书及视频。 1. 资料图解 首先需要下载资料,通常稳定发布版本可以从 www.amomcu.cn 下载, 也可以向我们客服获取最新版本, 获…

学习负载均衡的算法

什么负载均衡 负载均衡是一种计算机技术,用于在多个系统、网络链接、硬盘驱动器、CPU等之间分配工作负载,以优化资源使用、最大化吞吐量、最小化响应时间、并避免任何单一资源的过载。在网络负载均衡的情况下,它可以帮助将网络流量有效地分配…

WebAPI [Swagger] 发布ISS不能生成xml文件问题记录

因为Swagger文件的注释是读取项目xml的。 除了Debug要输出xml,正式发布release时也要输出xml

Camtasia2024试用版最新核心功能介绍

Camtasia的试用版通常提供与正式版本相同的核心功能,但可能会有一些限制或水印。以下是试用版中可能包含的一些功能: 屏幕录制:试用版允许用户录制电脑屏幕上的活动,无论是全屏、特定区域还是特定窗口。用户可以选择录制光标、添加…

LeetCode LCR 055.二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

基于PID-bang-bang控制算法的卫星姿态控制matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PID-bang-bang控制算法的卫星姿态控制。仿真输出控制器的控制收敛曲线,卫星姿态调整过程的动画。 2.系统仿真结果 3.核心程序与模型 版本:MATLAB…

c语言经典测试题3

1.题1 int a 248, b 4; int const *c 21; const int *d &a; int *const e &b; int const * const f &a; 请问下列表达式哪些会被编译器禁止? A: *c 32; B: *d 43 C: e&a D: f0x321f 我们来分析一下:const用来修饰变量是想其…

Kotlin filterIsInstance filterNotNull forEach

Kotlin filterIsInstance filterNotNull forEach fun main(args: Array<String>) {val i1 MyItem(1, 1)val i2: MyItem? nullval i3: Int 3val i4 "4"val i5 nullval i6 MyItem(6, 6)val list mutableListOf<Any?>(i1, i2, i3, i4, i5, i6)lis…

百度地图海量点方案趟坑记录(百度地图GL版 + MapVGL + vue3 + ts)

核心需求描述 不同层级有不同的海量图标展示底层海量图标需要展示文字拖动、放大缩小都需要重新请求数据并展示固定地图中心点&#xff08;拖动、放大缩小&#xff0c;中心点始终在地图中心&#xff09; 示例图片&#xff1a;&#xff08;某些图片涉及公司数据&#xff0c;就未…

靡语IT:Vue精讲(一)

Vue简介 发端于2013年的个人项目&#xff0c;已然成为全世界三大前端框架之一&#xff0c;在中国大陆更是前端首选。 它的设计思想、编码技巧也被众多的框架借鉴、模仿。 纪略 2013年&#xff0c;在Google工作的尤雨溪&#xff0c;受到Angular的启发&#xff0c;从中提取自…

unity学习(30)——跳转到角色选择界面(跳转新场景)

1.在scene文件夹中&#xff08;[siːn]&#xff09;&#xff0c;右键->create->scene&#xff0c;名字叫SelectMenu&#xff08;选择角色场景&#xff09;。 2.把新建场景拖拽到hierarchy[ˈhaɪərɑːki]中。 3.此时才能在file->build setting中Add open scene&…

图解李白的“朋友圈”

《长安三万里》作为2023年票房第一的国漫电影&#xff0c;以安史之乱为背景&#xff0c;从诗人高适的视角铺设了一幅绚丽的历史长卷&#xff0c;细细讲述“诗仙”李白跌宕起伏的一生&#xff0c;以及大唐盛世一路荣耀幻灭的唏嘘。同时&#xff0c;在这部动画电影中出现了多位大…

【了解机器学习的定义与发展历程】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱 简述概要 了解机器学习的定义与发展历程 知识图谱 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一门跨学科的学科&#xff0c;它使用计算机模拟或实现人类学习行为&#xff0c;通…

HTML5新婚、年会、各种聚会的现场抽奖活动(附源码)

文章目录 1.抽奖平台设计来源1.1 主界面效果1.2 抽奖效果1.3 中奖效果 2.效果和源码配置2.1 动态效果2.2 人员信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…
最新文章