嵌入式软件设计之设计模式

article/2025/9/14 14:58:34

文章目录

  • 前言
  • 1.设计模式之适配器模式
  • 2.设计模式之单例模式
  • 3.设计模式之命令模式
  • 4.设计模式之门面模式

前言

在嵌入式软件设计过程中,也会用到一些设计模式,所以说设计模式并不是面向对象语言的专利,下面我通过查资料以及自己的思考总结的几种适合嵌入式软件开发的设计模式,仅供参考。具体问题还要具体的分析。

1.设计模式之适配器模式

适配器模式是一种比较常用的软件设计模式(有时候叫做包装模式)。它将对象的接口转换成对于客户端(或者高层模块)来说比较容易使用的接口。通常来说,适配器用于应用程序编程接口(API)之上,以隐藏丑陋的接口或者可能发生变化的库。

很多硬件接口像笨拙的软件接口一样。可以把每个驱动程序设计为一个适配器。如果把驱动程序(即使不是open、close、read、write、ioctl)设计成通用的接口,那么当硬件接口改变的时候就不需要改变软件了。在理想的情况下可以切换整个平台而只需要修改底层实现。如下图:在这里插入图片描述
注意,驱动程序是可以堆叠的。例如:显示组件调用闪存,接着闪存调用SPI进行通信。当调用显示组件的open方法的时候,该方法调用其子系统的初始化代码,在这个初始化代码中调用闪存的open方法,然后这个方法调用SPI驱动程序的open方法。这里有三个层次的适配器是为了提高软件的可移植性和可维护性。如果对于每个层次的接口都是一致的,那么上层的代码就不可能变化了。

2.设计模式之单例模式

要确保系统中每个部分都可以访问相同的一个对象,我们可以使用单例模式
当需要一个类有且仅有一个实例的时候,单例模式是很常用的。在一个面向对象的语言中,单例模式很常用。其负责解析创建对象的请求并保持其独立的状态。对于资源的访问是全局的,但所有的访问必须经过这个唯一的实例。单例类中没有公共构造函数。在C++中类似于这样:

class Singleton
{public:static Singleton *Instance(){if(mInstance == 0){mInstance = new Singleton;}return mInstance;}protected:Singleton();//除了这个类本身没有其他类可以创建这个实例private:static Singleton *mInstance = 0;
}

比如对于日志系统来说,单例模式可以让整个系统通过唯一的实例来访问日志对象。通常当有一个单一的资源在系统的多个部分之间共享的时候,单例可以比较容易的避免冲突。在面向对象的语言中,单例也允许延迟资源分配和初始化,这样那些从来没有使用的模块就不会消耗资源。

3.设计模式之命令模式

这个模式的总体目标是将命令处理过程与实际要执行的动作解耦合。命令模式展示了一个执行操作的接口。任何时候,当你遇到这样一种情形,系统中的一部分需要对另一部分发起请求,但中介对象不需要知道这些请求的内容时,请考虑命令模式。
这个模式后续我会更新一个例子来说明。

4.设计模式之门面模式

可以想象,随着产品特性的扩展,IO接口变得越来越复杂。从长远来看,我们要隐藏每个子系统的细节。有一个标准的软件设计模式叫做门面模式(facade pattern),可以为一段代码提供一个简单的接口。门面模式旨在让软件库简单易用。
适配器模式是在两层之间充当转换的角色,门面模式则是通过简化底层的接口来做到这一点。隐藏子系统的实现细节是良好设计中很重要的一部分。它可以使代码更容易阅读,更便于测试。并且调用代码不依赖于子系统的内部实现,因此底层代码可以修改而门面则保持不变。
增加一个门面模式通常会使代码大小变大,但是从可调试性和可维护性角度来说,这样是值得的。


http://chatgpt.dhexx.cn/article/by58wIpi.shtml

相关文章

2、【已解决】Oracle错误问题(ORA-03113)

在执行一条sql时出现了如下问题: 处理方案网上找了一下日志,说是备份日志满了的原因; 通过以下方法看了下错误日志信息: 1、export TIME_STYLE%Y-%m-%d %H:%M:%S #格式化文件日期,便于查找错误文件 2、sqlplus &qu…

搭建ADG过程中复制报错 RMAN-03009 ORA-03113

搭建ADG过程中复制报错 RMAN-03009 ORA-03113 猜测主备之间网络路由过多导致。。。 开启mrp进程报错 发现数据文件是主库ASM的路径,备库是单机的 switch database to copy; 报错RMAN-6571 report schema;switch database to copy; select name from v$datafile;s…

oracle 启动报错03113,oracle数据库无法启动,总报ora-03113错误

虚机上装的oracle,由于系统突然宕机,导致了以下问题: 问题: 1、监听无法启动: $ lsnrctl start LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 22-NOV-2018 15:27:11 Copyright (c) 1991, 2013, Oracle. Al…

oracle 启动报错03113,Oracle 入门之Oracle启动报错“ORA-03113”

Oracle 入门之Oracle启动报错“ORA-03113” [日期:2010-09-25] 来源:Linux社区 作者:naruto6006 [字体:大 中 小] 早上连接Oracle,发现oracle无法正常工作,无法shutdown immediate方式关闭,shutdown abort方…

linux oracle 03113,Oracle数据库关闭时出现ORA-03113错误

Oracle数据库关闭时,出现ORA-03113错误: SQL> shutdown immediate ORA-03113: end-of-file on communication channel Process ID: 3437 Session ID: 125 Serial number: 5 SQL> startup ORA-24324: service handle not initialized ORA-01041: in…

oracle startup open ora 03113,oracle宕机,startup报错ora03113

一、故障情况 应用无法连接数据库,检查oracle发现已经宕机。 startup 后报错 ORA-03113: end-of-file on communication channel 二、查找原因 查看alter日志 tail -500 /oracle/database/oracle/diag/rdbms/udb/udb1/trace/alter_UDB1.log Unable to create archiv…

ora03113通信通道的文件结尾 会话id 149 序列号 3

ORA-19815: 警告: db_recovery_file_dest_size 字节 已使用100.00%, 尚有 0 字节可用。” 是db_recovery_file_dest_size也叫归档日志空间不足导致 解决方法 第一步,将空间设置大点,另一个就是将多余的文件删除掉即可,那么我们就将这两个办法…

ORA-03113:通信通道的文件结尾

转自--------------http://blog.csdn.net/zwk626542417/article/details/39667999 由来 今天跟往常一样,登陆PL/SQL,确登陆失败,出现一个错误“ORA-01034”和“ORA-27101”如图: 然后就就通过命令提示符去登陆Oracle,去…

ORA-03113:通信通道的文件结尾-完美解决方案

今天发现系统登录和查询数据特别慢,orcl进程占用内存也特别高。打开程序调试用,存储过程调用时报错【ORA-03113:通信通道的文件结尾】 解决方案: oracle 文档中对这个错误这样解释: ORA-03113 错误就是说连接到数据…

ORA-03113: 通信通道的文件结尾

一、报错及错误原因 启动oracle数据库事报错:ORA-03113: 通信通道的文件结尾,报错内容如下图 出现问题后,去查看告警日志文件(D:\app\diag\rdbms\cjyorcl\cjyorcl\trace\alert_cjyorcl.log),日志报错内容如…

TinyPng:在线PNG图片压缩工具

本资源由 伯乐在线 - 卢伟 整理 TinyPng:在线PNG图片压缩工具是一款可以帮助网页设计师们优化图片的工具,只需要简单的两步就可以完成对PNG图片的高压缩而且还不会影响PNG图片的质量,这样就可以解决网页设计师因图片太大而影响网站加载网页速度的难题。 …

在线PNG图片压缩工具推荐——TinyPng

日常开发工作中时常需要对PNG图片压缩,今天推荐大家一个在线的图片压缩工具,ThinyPng 在线地址:TinyPNG – Compress WebP, PNG and JPEG images intelligently TinyPng:在线PNG图片压缩工具是一款可以帮助网页设计师们优化图片的工具&#x…

Image 图片

Image 图片 随机矩阵画图 这一节我们讲解怎样在matplotlib中打印出图像。这里打印出的是纯粹的数字,而非自然图像。下面用 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel。 import matplotlib.pyplot as plt import numpy as npa np.array([0.…

libpng 处理png图片

尝试 最近遇到一个需求需要处理png 图片,由于处理过bmp 图片,所以想跟bmp 图片的处理过程一样直接去掉头信息,但是发现解开png之后发现头信息中数据长度和实际的的,data 数据量对不上,发现数据是压缩,跟bm…

Image Manipulation with StyleGAN

StyleGAN 特征插值算法复现 本教程通过对 StyleGanV2 网络上的部分修改,实现图片的拼接。 参考论文 StyleGAN of All Trades: Image Manipulation with Only Pretrained StyleGAN 一、StyleGAN 简介 在GAN出现之前,图形学已经出现了一个重要分支&…

GIMP( GNU IMAGE MANIPULATION PROGRAM)

openGL系列文章目录 文章目录 openGL系列文章目录前言一、GIMP获取?二、使用步骤1.安装2.GIMP使用 总结 前言 我们在使用openGL处理纹理时,为了达到某种特效需要对三维模型添加纹理,而有些纹理在网上是下不到的,而且在一些商用项…

【PNG overview】PNG专题!

【PNG overview】PNG专题! 作者 鼯鼠 2007.1.22 转贴请注明出处 这段时间因为工作原因开始接触PNG,遇到问题的时候,在网上搜索资料总是零零碎碎,而且有很多的说法根没就是人云亦云,信手拈来,根本…

php imagejpeg函数,php imagepng()函数有什么用?

imagepng()是PHP中的一个内置函数,用于在浏览器或文件中显示图像。该函数的主要用途是在浏览器中查看图像,将任何其他图像类型转换为PNG,并对图像应用过滤器。 语法:bool imagepng( resource $image, int $to, int $quality, int …

image features extraction

目录 一.概述 二.图像的边缘特征及其检测方法 1.图像的边缘特征 2.梯度边缘检测 (1)原理 (2)Roberts算子 (3)Sobel算子 (4)Prewitt算子 3.二阶微分边缘检测 4.Marr边缘检测算…