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

文章目录

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

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

模板模式介绍

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

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

UML用例说明

C语言实现设计模式—模板模式_第1张图片

实际场景使用

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

改进方法:

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

框架结构[共用框架]—通用的串口协议分析函数

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) \r\n",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 = %d\r\n",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);

}

你可能感兴趣的:(设计模式)