0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式软件设计模式 好文值得收藏

lucky的记录与分享 来源:lucky的记录与分享 作者:lucky的记录与分享 2022-06-20 09:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文引用自本人公众号文章:

嵌入式开发中的两点编程思想

C语言也很讲究设计模式?一文讲透

包含如下:

01)C语言和设计模式(继承、封装、多态)

02)C语言和设计模式(访问者模式)

03)C语言和设计模式(状态模式)

04)C语言和设计模式(命令模式)

05)C语言和设计模式(解释器模式)

06)C语言和设计模式(备忘录模式)

07)C语言和设计模式(观察者模式)

08)C语言和设计模式(桥接模式)

09)C语言和设计模式(建造者模式)

10)C语言和设计模式(中介者模式)

11)C语言和设计模式(策略模式)

12)C语言和设计模式(适配器模式)

13)C语言和设计模式(装饰模式)

14)C语言和设计模式(享元模式)

15)C语言和设计模式(代理模式)

16)C语言和设计模式(外观模式)

17)C语言和设计模式(迭代器模式)

18)C语言和设计模式(抽象工厂模式)

19)C语言和设计模式(责任链模式)

20)C语言和设计模式(工厂模式)

21)C语言和设计模式(模板模式)

22)C语言和设计模式(组合模式)

23)C语言和设计模式(原型模式)

24)C语言和设计模式(单件模式)

25)C语言和设计模式(开篇)

-----------------------
01)C语言和设计模式(继承、封装、多态)

记得还在我们大学C++第一门课的时候,老师就告诉我们说,C++是一门面向对象的语言。C++有三个最重要的特点,即继承、封装、多态。等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。可是,等我工作以后,使用的编程语言更多的是C语言,这时候我又想能不能把C语言变成面向对象的语言呢?等到后来通过思考和实践,我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。
(1)继承性
typedef struct _parent
{
int data_parent;
}Parent;
typedef struct _Child
{
struct _parent parent;
int data_child;
}Child;
在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
(2)封装性
struct _Data;
typedef void (*process)(struct _Data* pData);
typedef struct _Data
{
int value;
process pProcess;
}Data;
封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
(3)多态
typedef struct _Play
{
void* pData;
void (*start_play)(struct _Play* pPlay);
}Play;
多态,就是说用同一的接口代码处理不同的数据。比如说,这里的Play结构就是一个通用的数据结构,我们也不清楚pData是什么数据,start_play是什么处理函数?但是,我们处理的时候只要调用pPlay->start_play(pPlay)就可以了。剩下来的事情我们不需要管,因为不同的接口会有不同的函数去处理,我们只要学会调用就可以了。

-----------------------

02)C语言和设计模式(访问者模式)


不知不觉当中,我们就到了最后一种设计模式,即访问者模式。访问者模式,听上去复杂一些。但是,这种模式用简单的一句话说,就是不同的人对不同的事物有不同的感觉。比如说吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐。可是,不同的地方的人未必都喜欢这两种豆腐。四川的朋友可能更喜欢辣豆腐,江浙的人就可能对臭豆腐更喜欢一些。那么,这种情况应该怎么用设计模式表达呢?
typedef struct _Tofu
{
int type;
void (*eat) (struct _Visitor* pVisitor, struct _Tofu* pTofu);
}Tofu;
typedef struct _Visitor
{
int region;
void (*process)(struct _Tofu* pTofu, struct _Visitor* pVisitor);
}Visitor;
就是这样一个豆腐,eat的时候就要做不同的判断了。
void eat(struct _Visitor* pVisitor, struct _Tofu* pTofu)
{
assert(NULL != pVisitor && NULL != pTofu);
pVisitor->process(pTofu, pVisitor);
}
既然eat的操作最后还是靠不同的visitor来处理了,那么下面就该定义process函数了。
void process(struct _Tofu* pTofu, struct _Visitor* pVisitor)
{
assert(NULL != pTofu && NULL != pVisitor);
if(pTofu->type == SPICY_FOOD && pVisitor->region == WEST ||
pTofu->type == STRONG_SMELL_FOOD && pVisitor->region == EAST)
{
printf("I like this food!\n");
return;
}
printf("I hate this food!\n");
}

-----------------------------------------------------

03)C语言和设计模式(状态模式)

状态模式是协议交互中使用得比较多的模式。比如说,在不同的协议中,都会存在启动、保持、中止等基本状态。那么怎么灵活地转变这些状态就是我们需要考虑的事情。假设现在有一个state,
typedef struct _State
{
void (*process)();
struct _State* (*change_state)();
}State;
说明一下,这里定义了两个变量,分别process函数和change_state函数。其中proces函数就是普通的数据操作,
void normal_process()
{
printf("normal process!\n");
}
change_state函数本质上就是确定下一个状态是什么。
struct _State* change_state()
{
State* pNextState = NULL;
pNextState = (struct _State*)malloc(sizeof(struct _State));
assert(NULL != pNextState);
pNextState ->process = next_process;
pNextState ->change_state = next_change_state;
return pNextState;
}
所以,在context中,应该有一个state变量,还应该有一个state变换函数。
typedef struct _Context
{
State* pState;
void (*change)(struct _Context* pContext);
}Context;
void context_change(struct _Context* pContext)
{
State* pPre;
assert(NULL != pContext);
pPre = pContext->pState;
pContext->pState = pPre->changeState();
free(pPre);
return;
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20146

    浏览量

    328811
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144609
  • 嵌入式软件
    +关注

    关注

    4

    文章

    247

    浏览量

    27819
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式可测试性软件设计

    单元测试框架 ,用来统一管理我们的测试例子。 嵌入式中,常用的测试框架: Unity:https://github.com/ThrowTheSwitch/Unity/releases cutest
    发表于 12-02 06:06

    CW32嵌入式软件开发的必备知识

    嵌入式软件开发作为计算机科学和电子工程的交叉领域,要求开发人员具备一系列的专业知识和技能。 而基于CW32的嵌入式软件开发必备知识包括以下部分: 1 、编程语言 熟练掌握C(C++
    发表于 11-28 07:48

    在以下嵌入式软件设计模型中,属于数据流模型的是,哪里有设计模型的介绍?

    在以下嵌入式软件设计模型中,属于数据流模型的是()。A. CCSB. CSPC. FSMD. Petri Net
    发表于 11-24 15:55

    RT-Thread 2025嵌入式软件大赛重磅来袭

    为激发开发者潜能、促进技术交流,RT-Thread 正式启动2025年度嵌入式软件大赛! 本赛道为嵌入式软件大赛,聚焦嵌入式
    的头像 发表于 09-22 16:40 3251次阅读
    RT-Thread 2025<b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>大赛重磅来袭

    RT-Thread 2025嵌入式软件大赛重磅来袭

    为激发开发者潜能、促进技术交流,RT-Thread正式启动2025年度嵌入式软件大赛!本赛道为嵌入式软件大赛,聚焦嵌入式
    的头像 发表于 09-20 10:06 1290次阅读
    RT-Thread 2025<b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>大赛重磅来袭

    新一代嵌入式开发平台 AMD嵌入式软件和工具2025.1版现已推出

    AMD 2025.1 版嵌入式软件和工具是面向新一代嵌入式系统开发而打造的综合平台,全面加速概念构想到部署落地。 2025.1 版嵌入式软件
    的头像 发表于 08-20 09:15 3627次阅读

    AMD 2025.1版嵌入式软件和工具的新增功能

    AMD 2025.1 版嵌入式软件和工具是面向新一代嵌入式系统开发而打造的综合平台,全面加速概念构想到部署落地。
    的头像 发表于 08-15 15:32 1031次阅读

    【干货速递】嵌入式数据可靠性,软件设计的这些细节不能忽视!

    前两期内容分别讲述了嵌入式数据可靠性的元器件选型和硬件设计,这一期我们来讲讲软件设计。哪怕硬件设计再完善,但如果软件没有设计好,也达不到预期的可靠性。只有软硬件配合,才能妥善解决数据可靠性
    的头像 发表于 07-31 11:34 366次阅读
    【干货速递】<b class='flag-5'>嵌入式</b>数据可靠性,<b class='flag-5'>软件设计</b>的这些细节不能忽视!

    河北软件职业技术学院走访飞凌嵌入式,共同探讨产教融合新模式

    6月12日,河北软件职业技术学院软件工程系主任陈辉率队走访保定飞凌嵌入式技术有限公司,并与旗下教育品牌ElfBoard就产教融合、构建协同育人机制进行了深入探讨。双方旨在通过深化校企合作,共同探索
    的头像 发表于 06-16 11:00 935次阅读
    河北<b class='flag-5'>软件</b>职业技术学院走访飞凌<b class='flag-5'>嵌入式</b>,共同探讨产教融合新<b class='flag-5'>模式</b>

    嵌入式开发入门指南:从零开始学习嵌入式

    开发(设备驱动、内核编译) 4. 推荐的学习资源书籍:《嵌入式系统软件设计基础》《ARM Cortex-M系列嵌入式开发》在线课程:慕课网、B站嵌入式教学视频实践平台:Arduino、
    发表于 05-15 09:29

    嵌入式软件行业增长驱动因素

    嵌入式软件在物联网应用中至关重要,因为它管理设备操作、控制传感器、支持连接并确保数据安全。例如,在智能家居中,恒温器、安全摄像头和灯光等设备使用嵌入式系统独立运行,并通过云平台或本地网络与其他智能
    的头像 发表于 05-09 11:26 665次阅读

    嵌入式编程设计模式

    嵌入式编程设计模式,介绍如何使用设计模式嵌入式系统创建高效且优化的C语言设计。 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持一下哦~
    发表于 04-15 14:47

    嵌入式机器学习的应用特性与软件开发环境

    设备和智能传感器)上,这些设备通常具有有限的计算能力、存储空间和功耗。本文将您介绍嵌入式机器学习的应用特性,以及常见的机器学习开发软件与开发环境。 嵌入式机器学习的应用特性与优势 由于嵌入式
    的头像 发表于 01-25 17:05 1210次阅读
    <b class='flag-5'>嵌入式</b>机器学习的应用特性与<b class='flag-5'>软件</b>开发环境

    哪些专业适合学习嵌入式开发?

    网络协议与标准,包括MQTT、CoAP以及HTTP等,适合物联网领域的数据交换和通信。 5)物联网工程:直接关联物联网领域,涉及嵌入式系统、网络通信、数据处理与分析等,适合物联网领域。 6)机械专业:机械专业的学生可以通过学习嵌入式软件
    发表于 01-03 13:44

    嵌入式系统开发与硬件的关系 嵌入式系统开发常见问题解决

    嵌入式系统开发与硬件的关系 嵌入式系统是专为特定应用设计的计算机系统,它们通常嵌入在所控制的设备中。这些系统的关键特点是它们与硬件的紧密集成,这意味着软件必须为特定的硬件平台量身定制。
    的头像 发表于 12-09 09:38 1466次阅读