C语言实现设计模式-策略模式+命令模式组合使用
文章目录
- 使用环境介绍
- 使用策略模式-区分使用哪种方法
- 使用命令模式-区分哪种命令动作
使用环境介绍
当主设备和从设备使用串口信息交互通讯,根据串口协议,实现对从设备的控制访问。
使用情况1:当主设备发送板卡信息获取、读取数据命令时,希望获取从设备的数据信息,从设备应答操作。
使用情况2:当主设备发送采集命令时,从设备收到但不进行回复,不应答操作。
使用策略模式-区分使用哪种方法
- 首先识别命令,对需要进行应答的命令进行判断,区分命令,以下命令都是从设备进行应答的命令。
const rz_sensor_cmd_type_t support_send_cmd_reply[] = {CMD_READ_DATA,CMD_READ_INFO,CMD_READ_PARAMETERS,CMD_PREPARE_UPDATE,CMD_SEGMENT_UPDATE,
};
- 再动作函数区分:
- rz_subassembly_uart_send_without_reply (发送数据包,从机不进行响应应答)
- rz_subassembly_uart_send (发送数据包,从机进行响应应答)
/** Strategy mode* The strategy mode is to use a unified method interface to access different types of data separately.*/
uint32_t rz_sensor_uart_send(SubAssembly_Data_Type *t,uint8_t sensorType,uint8_t addr,uint8_t cmd,uint16_t len,uint8_t *buf)
{uint8_t cmd_type = sizeof(support_send_cmd_reply)/sizeof(rz_sensor_cmd_type_t);uint32_t (*pfunc)(SubAssembly_Data_Type *t,uint8_t sensorType,uint8_t addr,uint8_t cmd,uint16_t len,uint8_t *buf);for (uint8_t i=0; i < cmd_type; i++) {/* If the interface function cannot be found, the default interface function is used */pfunc = rz_subassembly_uart_send_without_reply;if (cmd == support_send_cmd_reply[i]) {/* if matched, call the reload interface */pfunc = rz_subassembly_uart_send;break;}}/* Call interface function for processing */if (1 != pfunc(t,sensorType,addr,cmd,len,buf)) {rt_kprintf("rz_sensor_uart_send failed, sensorType=0x%02x, addr=0x%02x, cmd=0x%02x\r\n",sensorType, addr,cmd);return 0;}return 1;}
使用命令模式-区分哪种命令动作
- 串口接收数据,可根据不同的功能码进行不同的响应执行,这样整体的解析函数不需要改动。
使用参数结构体进行统一的参数管理,命令和函数动作区分
typedef struct sensor_cmd_param_def {SubAssembly_Data_Type *pAssembly;uint8_t sendCmd;uint8_t cmd;uint16_t dataLength;uint8_t *dataBuf;
} sensor_cmd_param_t;typedef struct sensor_cmd_msg_def {uint8_t type;uint32_t ( *do_process_cmd ) ( sensor_cmd_param_t *param );
} sensor_cmd_msg_t;
- 统一的命令接口解析,后期即使业务需求改动,只需要改动子模块即可。
static const sensor_cmd_msg_t bolt_cmd_process_table[] = {{READ_DATA, bolt_cmd_process_read_data},{READ_INFO, bolt_cmd_process_read_info},{READ_PARAMETERS, bolt_cmd_process_read_param},{PREPARE_UPDATE,bolt_cmd_process_read_update_info},{SEGMENT_UPDATE,bolt_cmd_process_send_data_packet},
};
uint32_t bolt_cmd_process (SubAssembly_Data_Type *pAssembly, uint8_t sendCmd,uint8_t cmd, uint16_t dataLength, uint8_t *dataBuf)
{uint8_t num_items = sizeof (bolt_cmd_process_table) /sizeof(bolt_cmd_process_table[0]);uint8_t ret = 0;sensor_cmd_param_t *param = (sensor_cmd_param_t *)calloc(1,sizeof ( sensor_cmd_param_t ));if (CHECK_PTR_OBJECT(param)) {rt_kprintf ( "%s(),line %d, malloc failed\r\n", __FUNCTION__, __LINE__ );return 0;}param->pAssembly = pAssembly;param->sendCmd = sendCmd;param->cmd = cmd;param->dataLength = dataLength;param->dataBuf = dataBuf;for (uint8_t target = 0; target < num_items; target++) {if (bolt_cmd_process_table[target].type == cmd) {ret = bolt_cmd_process_table[target].do_process_cmd ( param );break;}}if (param != NULL) {free (param);param = NULL;}return ret;
}
C语言实现设计模式-策略模式+命令模式组合使用相关推荐
- 【白话设计模式八】命令模式(Command)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 《设计模式详解》行为型模式 - 命令模式
命令模式 6.3 命令模式 6.3.1 概述 6.3.2 结构 6.3.3 案例实现 6.3.4 优缺点 6.3.5 使用场景 6.3.6 JDK 源码 - Runnable 完整的笔记目录:< ...
- 备忘录模式 命令模式_备忘录设计模式示例
备忘录模式 命令模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重 ...
- Head First 设计模式中的命令模式 的一个错误
最近在看Head First 设计模式,其中命令模式中有讲到实现撤销功能,并且作者还出了一道题, 下面的是书中习题: public class MarcoCommand implements Comm ...
- 设计模式-行为型模式-命令模式
设计模式-行为型模式-命令模式 基础 以一个MIS系统为栗子 MIS 管理信息系统(Management Information System,MIS)是一个以人为主导的,利用计算机硬件.软件和网络设 ...
- Head First 设计模式总结(六) 命令模式
本文总结了<Head First 设计模式>中的命令模式 命令模式--将请求封装成"对象",以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销操作. ...
- 【设计模式】从命令模式到录像(replay)系统
引言 这几天看到<游戏编程模式>中的到命令模式一章,这个模式说起来并不是很熟,想着大概也像观察者模式,单例之类的,被用了很多次却不自知吧,没想到还真的对我有所启发. 命令模式 命令模式,将 ...
- 设计模式 — 行为型模式 — 命令模式
目录 文章目录 目录 命令模式 应用场景 代码示例 命令模式 命令模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者). 命令模式的思路是在调用者和接收者之间插入一个命令类(Comman ...
- 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑
课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.
最新文章
- Apache Kylin v2.5.0正式发布,开源分布式分析引擎
- linux使用lftp文件自动认证上传下载
- mysql学习笔记06分组语句的使用
- React开发(106):方法定义 不然弹出框报错
- 微信小程序按钮Button使用详解
- 11-8 热点key的重建优化
- xshell5免费版本下载
- iOS 如何找到或生成 .dSYM 文件
- 计算机网络 | 思科网络 | 什么是DHCPv4
- 永恒之蓝病毒补丁+封445端口
- [BJDCTF2020]Mark loves cat 1
- ES6语法笔记(ES6~ES11)
- 初识ecshop小京东(2)—— 分页功能
- 时间字段加一秒_Mysql自动加1秒的问题
- Pytorch nn.Parameter()
- 为你揭露2018微信公开课pro的12个重点
- Python 绘制中国地图并标上国家名
- 【汇正财经】除权和除息是什么?
- 已知两点坐标,求直线方程、距离其中一点距离为L的某点
- 电脑上计算机中的文档怎么变成格子样,电脑有的软件文字显示小方格是怎么回事?怎样解决?...
热门文章
- el-radio-group change事件获取老值
- 第八章 交互技术,8.1 VR电商购物(作者:宋五)
- 天翼云联想云坚果云我应该选择哪一个呢?
- 【NFS】CFS文件管理
- 计算机自带的配置检测,Win10如何使用系统自带的硬件设备检测工具?
- 八段锦的运动特点及养生原理
- 写一些生活的琐事(纯属发泄)
- android手机电视互动,手机APP控制电视 长虹智能机多屏互动体验(组图)
- ibatis学习以及与mybatis的不同
- android 克隆攻击原理,通过CTF学习Android漏洞(炸弹引爆+dex修复)2015 RCTF / 攻防世界高手区 where...