Design patterns--装饰模式
设计模式之装饰模式
使用装饰模式来封装Nmea0183语句。
- 代码
#ifndef DATAPARSER_H
#define DATAPARSER_H#include <string>
#include <vector>class DataParser
{
public:DataParser();virtual std::string fieldAnalysis(std::vector<std::string> vecStr) = 0;
};#endif // DATAPARSER_H#include "dataparser.h"DataParser::DataParser()
{}
#ifndef NMEAHANDLE_H
#define NMEAHANDLE_H
#include "dataparser.h"class NmeaHandle : public DataParser
{
public:NmeaHandle();std::string fieldAnalysis(std::vector<std::string> vecStr) override;
};#endif // NMEAHANDLE_H#include "nmeahandle.h"NmeaHandle::NmeaHandle()
{}std::string NmeaHandle::fieldAnalysis(std::vector<std::string> vecStr)
{std::string stmt = "";if(vecStr.size() > 0){unsigned int i = 0;for(const auto& item : vecStr){stmt += item;if(i == (vecStr.size() - 1)){stmt += "*";}else{stmt += ",";}i++;}}return stmt;
}
#ifndef NMEADECORATOR_H
#define NMEADECORATOR_H
#include "dataparser.h"class NmeaDecorator : public DataParser
{
public:NmeaDecorator(DataParser* dp);std::string calcChecksum(const std::string& sentence);protected:DataParser* m_dataParser;
};#endif // NMEADECORATOR_H#include "nmeadecorator.h"
#include <sstream>
#include <iomanip>NmeaDecorator::NmeaDecorator(DataParser* dp) : m_dataParser(dp)
{}std::string NmeaDecorator::calcChecksum(const std::string &sentence)
{int checksum = 0;for (char c : sentence) {if (c == '$') {continue;} else if (c == '*') {break;}checksum ^= static_cast<int>(c);}std::stringstream ss;ss << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << checksum;return ss.str();
}
#ifndef ZDA_STATEMENT_H
#define ZDA_STATEMENT_H
#include "nmeadecorator.h"class ZDA_Statement : public NmeaDecorator
{
public:ZDA_Statement(DataParser* dp);std::string fieldAnalysis(std::vector<std::string> vecStr) override;
};#endif // GPS_STATEMENT_H#include "zda_statement.h"ZDA_Statement::ZDA_Statement(DataParser* dp) : NmeaDecorator(dp)
{}std::string ZDA_Statement::fieldAnalysis(std::vector<std::string> vecStr)
{std::string stmt = "$GPZDA,";stmt += m_dataParser->fieldAnalysis(vecStr);stmt += calcChecksum(stmt);stmt += "\r\n";return stmt;
}
#ifndef GGA_STATEMENT_H
#define GGA_STATEMENT_H
#include "nmeadecorator.h"class GGA_Statement : public NmeaDecorator
{
public:GGA_Statement(DataParser* dp);std::string fieldAnalysis(std::vector<std::string> vecStr) override;
};#endif // GGA_STATEMENT_H#include "gga_statement.h"GGA_Statement::GGA_Statement(DataParser* dp) : NmeaDecorator(dp)
{}std::string GGA_Statement::fieldAnalysis(std::vector<std::string> vecStr)
{std::string stmt = "$GPGGZ,";stmt += m_dataParser->fieldAnalysis(vecStr);stmt += calcChecksum(stmt);stmt += "\r\n";return stmt;
}
#include <iostream>
#include "nmeahandle.h"
#include "gga_statement.h"
#include "zda_statement.h"
using namespace std;int main()
{std::vector<std::string> vecStr;vecStr.push_back("110");vecStr.push_back("108");NmeaHandle nmeaHandle;cout << nmeaHandle.fieldAnalysis(vecStr) << endl;std::vector<std::string> vecZDAStr;vecZDAStr.push_back("202711.56");vecZDAStr.push_back("25");vecZDAStr.push_back("12");vecZDAStr.push_back("2023");vecZDAStr.push_back("00");vecZDAStr.push_back("00");ZDA_Statement zdaStmt(&nmeaHandle);cout << zdaStmt.fieldAnalysis(vecZDAStr) << endl;std::vector<std::string> vecGGAStr;vecGGAStr.push_back("202711.56");vecGGAStr.push_back("1111.22");vecGGAStr.push_back("N");vecGGAStr.push_back("123.22");vecGGAStr.push_back("E");vecGGAStr.push_back("1");vecGGAStr.push_back("3");vecGGAStr.push_back("8.8");vecGGAStr.push_back("100");vecGGAStr.push_back("M");vecGGAStr.push_back("0.0");vecGGAStr.push_back("M");vecGGAStr.push_back("0.0");vecGGAStr.push_back("6");GGA_Statement ggaStmt(&nmeaHandle);cout << ggaStmt.fieldAnalysis(vecGGAStr) << endl;return 0;
}
相关文章:
Design patterns--装饰模式
设计模式之装饰模式 使用装饰模式来封装Nmea0183语句。 代码 #ifndef DATAPARSER_H #define DATAPARSER_H#include <string> #include <vector>class DataParser { public:DataParser();virtual std::string fieldAnalysis(std::vector<std::string> vecSt…...
卷积神经网络 反向传播
误差的计算 softmax 经过softmax处理后所有输出节点概率和为1 损失(激活函数) 多分类问题:输出只可能归于某一个类别,不可能同时归于多个类别。 误差的反向传播 求w的误差梯度 权值的更新...
java面试题20
Java中的类加载机制可继续通过自定义类加载器来实现热部署、插件化和动态加载等功能,使得应用程序能够在运行时加载未知的类和资源。 什么是Java中的多线程(Multithreading)?它有什么作用? 答案:多线程是一…...
【Java面试题】redis的过期策略有哪些
redis通过设置过期时间来控制键值对的存活时长,过期时间可以通过expire , pexpire expireat , pexpireat 等命令设置,String 类型数据可以通过setex命令设置过期时间。 以下介绍三种redis的过期策略: 1. 定时删除 在设置键值对的过期时…...
for参数 命令语句 变量
for 参数f skip命令语句 命令说明: 跳过文本内容(行):skip 例子: for /f "skip1" %%i in(2.txt) do echo %%i for 参数f eol命令语句 命令说明: 怱略指定字符的文本内容(文本首部…...
CentOS 8的新特性
CentOS 8在2019年发布,带来了比CentOS 7更多的新特性和改进。以下是一些主要的变化和优化: 软件包更新:CentOS 8提供了更新的软件包和程序,包括但不限于Python 3、MySQL 8、PHP 7.2、Ruby 2.5、PostgreSQL 10等。 应用流…...
vue2、vue3状态管理之vuex、pinia
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、状态管理之vuex1.1 State调用:1.2 Mutation在vuex中定义:在组件中使用: 1.3 Action在vuex中定义:将上面的减…...
axios进行图片上传组件封装
文章目录 前言图片上传接口(axios通信)图片上传使用upload上传头像效果展示总结 前言 node项目使用 axios 库进行简单文件上传的模块封装。 图片上传接口(axios通信) 新建upload.js文件,定义一个函数,该函数接受一个上传路径和一…...
2312llvm,用匹配器构建clang工具
原文 用LibTooling和LibASTMatchers构建工具 这里展示如何基于Clang的LibTooling构建有用的源到源翻译工具.基础 步骤0:取Clang 因为Clang是LLVM项目的一部分,因此你需要先下载LLVM的源码.Clang和LLVM都在同一个git仓库中,在不同的目录下.更多见入门指南. cd ~/clang-llvm…...
12.26ARM作业
三个按键中断,控制对应灯亮灭 main.c #include "key_it.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){all_led_init();key1_it_config();key2_it_config();key3_it_config();while(1){printf("do main...\n&…...
Objectiv-C设计模式笔记
文章目录 通用知识点对象创建原型模式定义适用场景示例 工厂方法定义适用场景示例 抽象工厂定义适用场景示例 生成器模式定义适用场景示例 单例模式定义适用场景示例 接口适配适配器定义适用场景示例 桥接定义适用场景示例 外观模式定义适用场景示例 对象去耦中介者定义适用场景…...
AI安全综述
1、引言 AI安全这个话题,通常会引伸出来图像识别领域的对抗样本攻击。下面这张把“熊猫”变“猴子”的攻击样例应该都不陌生,包括很多照片/视频过人脸的演示也很多。 对抗样本的研究领域已经具备了一定的成熟性,有一系列的理论来论述对抗样本…...
计算机网络概述(下)——“计算机网络”
各位CSDN的uu们你们好呀,今天继续计算机网络概述的学习,下面,让我们一起进入计算机网络概述的世界吧!!! 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…...
anaconda创建环境时安装默认的第三方库
感谢阅读 写作原因首先要有python解释器加入每次创建环境都需要的python库查看所有的默认安装库还原方法 写作原因 近期由于多个项目在多头并举,出现了每次安装环境都要重新打一遍指令的麻烦问题,出于节约时间从而提高工作效率的目的。我尝试了很多方法…...
STM32 cubeMX 光敏电阻AD转化实验
文章代码使用 HAL 库。 文章目录 前言一、光敏电阻介绍二、光敏电阻原理图解析三、ADC采样介绍1. 工作原理:2. ADC精度: 四、STM32 cubeMX配置ADC采样五、代码编写总结 前言 实验开发板:STM32F051K8。所需软件:keil5 ,…...
AutoSAR(基础入门篇)3.2-Autosar中RTE的Ports【S/R】与【C/S】
目录 一、RTE的Ports【S/R】 1、特征 1.1、扮演SWCs和BSW的交流途径 1.2、其他特征...
安装kafka
静态文件安装(单机) 解压到指定目录(解压到 /usr) tar -zxf kafka_2.11-2.2.0.tgz -C /usr/ 到指定的解压目录下 cd /usr/kafka_2.11-2.2.0/ 配置主机名 查看是否配置了HOSTNAME vim /etc/sysconfig/network 没有就新增 HOSTNA…...
[MySQL] MySQL 高级(进阶) SQL 语句
一、高效查询方式 1.1 指定指字段进行查看 事先准备好两张表 select 字段1,字段2 from 表名; 1.2 对字段进行去重查看 SELECT DISTINCT "字段" FROM "表名"; 1.3 where条件查询 SELECT "字段" FROM 表名" WHERE "条件…...
创建springboot项目
SpringBoot 就相当于不需要配置文件的SpringSpringMVC。 常用的框架和第三方库都已经配置好了。 maven安装配置 管理项目依赖库的 maven的安装教程网上有很多,这里简单记录一下。 官网下载maven后并解压。 在其目录下添加一个目录repository 然后在conf目录下…...
“双十一、二” 业务高峰如何扛住?韵达快递选择 TDengine
小 T 导读: 为了有效处理每日亿级的数据量,早在 2021 年,韵达就选择用 TDengine 替代了 MySQL,并在三台服务器上成功部署和上线了 TDengine 2.0 集群。如今,随着 TDengine 3.0 版本的逐渐成熟,韵达决定将现…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
