首页 > 编程知识 正文

设计模式 c语言中文网,c语言常用的设计模式

时间:2023-05-04 22:29:47 阅读:270948 作者:2496

文章目录 C语言实现设计模式—模板模式模板模式介绍UML用例说明实际场景使用框架结构[共用框架]—通用的串口协议分析函数不同实现—数据类型区别

C语言实现设计模式—模板模式 模板模式介绍

在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现) 在不同的对象中有不同的细节实现, 但是逻辑(算法) 的框架(或通用的应用算法)是相同的。 Template 提供了这种情况的一个实现框架。

优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

UML用例说明

实际场景使用

单片机的串口收到不同对象数据类型,随着与每种对象的串口交互协议都不一样,会对每个串口协议都单独进行拆解分析,这样的架构的基础上程序会越写越多,随着对象的数据类型增加,这样的程序会越来越臃肿,不好维护,不符合程序设计开闭原则。

改进方法:

写一个通用的串口协议解析函数,这样即使后期需求更改,也不会影响整体。

框架结构[共用框架]—通用的串口协议分析函数 uint32_t rz_public_communication_parse(uint8_t *recBuf,uint16_t recLen, rz_uart_dev_type_t mode){uint16_t len = 0;uint16_t i = 0;uint8_t sum=0;if (true != uart_data_type_check(recBuf,recLen,mode)) {return 0;}/* check : recvive len */len = recBuf[4] + recBuf[5] * 256;if (len != recLen) {rt_kprintf("receive length error! len(%d) != recLen(%d) rn",len,recLen);return 0;}/* check : sum */for (i = 0; i < len; i ++) {sum = sum + recBuf[i];}if (0 != sum) {rt_kprintf("receive check sum error,checksum = %drn",sum);return 0;}return 1;} 不同实现—数据类型区别

这里以四种不同的串口协议数据分析,后期业务增加也不会改成模块程序。

static bool (*uart_data_type_check_cbs[UART_DEV_TYPE_MAX])(uint8_t *pbbuf, uint16_t len) = { uart_data_type_debug_check,uart_data_type_rh1200_check,uart_data_type_rh124_check,uart_data_type_rh172_check,};static bool uart_data_type_check(uint8_t *recBuf, uint16_t recLen,rz_uart_dev_type_t type){if (NULL == uart_data_type_check_cbs[type]) {return true;} return uart_data_type_check_cbs[type](recBuf, recLen);}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。