当前位置:首页 > 公众号精选 > 嵌入式微处理器
[导读]前言+ 这里先插一点题外话,在C语言中,实现封装、继承、隐藏、多态等等特性,是完全没有问题的。但是在使用过程中,必定是不如自带这些特性的语言方便好用的,比如C++\java等。 一旦要通过C语言来实现各种设计模式,必定会在严谨地维护类层次上造成非常繁琐


前言+


这里先插一点题外话,在C语言中,实现封装、继承、隐藏、多态等等特性,是完全没有问题的。但是在使用过程中,必定是不如自带这些特性的语言方便好用的,比如C++\java等。

一旦要通过C语言来实现各种设计模式,必定会在严谨地维护类层次上造成非常繁琐和臃肿的代码。这是因为C++/java等自带一套面向对象的工具,而C语言要在代码设计中,不断地根据实际情况来创造面向对象的工具。

因此对于文章的内容,请大家主要关注、体会设计模式本身,更多地去考虑程序的可扩展性和可维护性。

文章本身是希望向C语言爱好者普及设计模式的知识,在所有的程序设计中,本意都是尽可能地简单易懂。因此抛开设计模式的本意去讨论程序的代码实现优劣,是没有任何意义的。之前发表的c语言面向对象系列文章确实参考了网上很多资料和书籍,也借鉴了其中一些案例。但是代码确实是自己完整实现的,并复制粘贴在菜鸟 C 在线工具进行验证了(https://c.runoob.com/compile/11)。今后类似借鉴、抄袭等等话题不想再次和大家争论,容易伤和气。毕竟只是希望大家能从我的文章有所收获而已,不喜欢直接左上角关闭就好。

鉴于之前有部分读者过于关注程序本身的功能性,更有甚者仅因为某一两方面见解不同就口出恶言。唯恐这样下去只会把技术的圈子搞臭。因此以后的c语言设计模式将不再给出具体实现,只讲解模式动机和设计思路。

希望大家可以针对设计模式方面给文章提出一些改进的建议,本人可以保证,对于无恶意、有针对性的建议,一定会吸收接纳、及时改正。

接下来是文章的正文部分。

模式动机

完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。

在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。

简单来说,策略模式就是用统一的方法接口分别对不同类型的数据进行访问。

场景案例

场景:现在我们想用pc看一部电影,但是影片本身有多种播放格式。比如rmvb要rmvb格式的方法,avi要avi的方法,mpeg要mpeg的方法。

传统代码实现

...
void main()
{
...
if (movie == avi)
{
...//avi影片的播放策略
}
else if (movie == rmvb)
{
...//rmvb影片的播放策略
}
else if
...
}

在上面的代码实现中,把所有的功能代码全部集中在一个函数里面完成了,随着分支的扩展,整个函数会越来越臃肿,非常难以维护。我们应该把每个分枝的实现抽离出来,封装在函数里面实现。

改进代码实现1:

...
void main()
{
if (movie == avi)
{
play_avi_movie();//avi影片的播放策略
}
else if (movie == rmvb)
{
play_rmvb_movie();//rmvb影片的播放策略
}
else if
...
}

在上面的代码实现中,我们通过把分支代码封装起来,减少了主函数的复杂性。但是从更高的一层的抽象看,主函数其实不关心各种分支情况。它希望的是,在进行必要的配置工作以后,直接调用某一个函数接口就能完成功能。

因此,我们应该把各个分支函数抽离出来,统一用某个函数接口来表示。只要在程序中进行完配置工作以后,那么主函数接下来就能直接调用该函数接口。

改进代码实现2:

void (*play_movie)();

void set_movie(char movie)
{
if(movie == avi)
{
play_movie = play_avi_movie;
}
else if(movie == rmvb)
{
play_movie = play_rmvb_movie;
}
else if
...
}

void main()
{
...
set_movie();
...
play_movie();
...
}

这就是c语言中的策略模式,重点在于分离各个分支的实现函数,主程序只需要通过唯一的接口,就能完成相应功能,提高了程序的可维护性和扩展性。


本文授权转载自公众号“embed linux share”,作者亚索老哥

-END-




推荐阅读



【01】C语言十大经典排序算法(动态演示+代码,值得收藏)
【02】C语言、嵌入式中几个非常实用的宏技巧
【03】C语言最全入门笔记
【04】绝对能检测你C语言基础水平的5个面试题
【05】C语言为何不会过时?你需要掌握多少种语言?

免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除



免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

嵌入式ARM

扫描二维码,关注更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭