当前位置: 首页 > news >正文

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;
}
http://www.lryc.cn/news/268291.html

相关文章:

  • 卷积神经网络 反向传播
  • java面试题20
  • 【Java面试题】redis的过期策略有哪些
  • for参数 命令语句 变量
  • CentOS 8的新特性
  • vue2、vue3状态管理之vuex、pinia
  • axios进行图片上传组件封装
  • 2312llvm,用匹配器构建clang工具
  • 12.26ARM作业
  • Objectiv-C设计模式笔记
  • AI安全综述
  • 计算机网络概述(下)——“计算机网络”
  • anaconda创建环境时安装默认的第三方库
  • STM32 cubeMX 光敏电阻AD转化实验
  • AutoSAR(基础入门篇)3.2-Autosar中RTE的Ports【S/R】与【C/S】
  • 安装kafka
  • [MySQL] MySQL 高级(进阶) SQL 语句
  • 创建springboot项目
  • “双十一、二” 业务高峰如何扛住?韵达快递选择 TDengine
  • STM32L432+LIS3DH【加速度传感器】:端侧AI
  • VCG Mesh刚性旋转(变换矩阵)
  • R语言【base】——system.file() 在软件包等中查找文件的完整文件名。
  • HTML制作暴雨特效
  • cesium实现区域贴图及加载多个gif动图
  • blackbox黑盒监控部署(k8s内)tensuns专用
  • “C语言“——scanf()、getchar() 、putchar()、之间的关系
  • Spring Boot3 Web开发技术
  • 学习笔记:数据挖掘与机器学习
  • highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动
  • ElasticSearch 架构设计