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.hqwc.cn/news/486641.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端数据可视化:ECharts使用

可视化介绍 ​  ​  应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出。   ​  数据可视化主要目…

小区视频汇聚与智能监管方案:老破小升级改造与小区智慧化建设

一、需求背景 在当今数字化时代,智慧小区已成为城市建设的必然趋势。加快小区智能化改造,不断完善小区管理和服务,彻底改变粗放型管理方式已经成为当前小区智慧化趋势的重要任务。其中,智能视频监控系统在提高小区安全性和管理效…

Java JDK 下载和配置

Java JDK 下载 下载网址:https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html jdk文件夹的目录介绍 bin: 主要存放的是Java的编译器、解析器等工具。 jre:Java runtime environment, Java 运行时环境。 jre/bin:Java平台…

使用logicflow流程图实例

一.背景 需要使用流程引擎开发项目,没有使用flowable、activiti这类的国外流程引擎,想使用国内的引擎二次开发,缺少单例模式的流程画图程序,都是vue、react、angluer的不适合,从网上找了antx6、logicflow、bpmn.js。感…

读取7400MB/s!华为发布eKitStor Xtreme M.2闪存条

今日,华为举行数据存储新春新品发布会,不仅发布全新数据湖解决方案,华为还针对商业市场与分销市场发布了全闪存存储新品。 据介绍,面向游戏加速、影视编辑、户外作业等场景,华为发布eKitStor Xtreme系列高性能M.2闪存条…

【C++】——模板初阶 | STL简介

前言: 模板初阶 | STL简介 文章目录 一、模板初阶1.1 函数模板1.2 类模板 二、STL简介 (了解) 一、模板初阶 泛式编程(Generic Programming)指的是一种编程范式,其核心思想是编写可以在不同数据类型上通用的代码&#…

Spring Boot 笔记 028 文章列表

1.1 导入中文语言包 1.2 显示文章分类 //回显文章分类 import { articleCategoryListService } from /api/article.js const articleCategoryList async () > {let result await articleCategoryListService();categorys.value result.data; }articleCategoryList() 1.3…

electron学习和新建窗口

首先我们要先下载electron npm install --save-dev electron 建立入口文件main.js 新建一个入口文件 main.js,然后导入eletron新建一个窗口。 const { app, BrowserWindow, ipcMain } require("electron"); const path require("path");func…

AppBox快速开发框架(开源)开发流程介绍

目前很多低代码平台都是基于Web用拖拽方式生成界面,确实可以极大的提高开发效率,但也存在一些问题: 大部分平台灵活性不够,特殊需求需要较大的自定义开发; 解析json配置的执行效率不是太高; 大部分平台缺…

为什么0.1+0.2不等于0.3

一、JS内部的计算是以二进制形式进行的 js里整数和小数转为二进制形式的方法是不一样的: 二、Number类型使用IEEE754标准64位存储 双精度浮点数(double类型)为每个数分配64位空间,并以科学计数法的方式存储: 那么对于…

NXP实战笔记(七):S32K3xx基于RTD-SDK在S32DS上配置ICU输入捕获

目录 1、概述 2、输入捕获SDK配置 2.1、SAIC中断方式 2.2、IPWM或者IPM 1、概述 输入捕获,可以抓取高电平时间、低电平时间、占空比、周期、边沿检测与回调函数、边沿计数(ABZ解码)、时间戳、唤醒中断。 记录一下根据Emios模块实现上述部分…

有哪些适合程序员的副业?

如果你经常玩知乎、看公众号(软件、工具、互联网这几类的)你就会发现,好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如:天涯神贴,基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下,迅雷…