Design patterns--装饰模式

设计模式之装饰模式

使用装饰模式来封装Nmea0183语句。

  • 代码
c 复制代码
#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()
{

}

cpp 复制代码
#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;
}

cpp 复制代码
#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();
}

cpp 复制代码
#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;
}

cpp 复制代码
#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;
}

cpp 复制代码
#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;
}
相关推荐
贾斯汀玛尔斯25 分钟前
每天学一个算法--倒排索引(Inverted Index)
算法·inverted-index
楼田莉子28 分钟前
Linux网络:NAT_代理
linux·运维·服务器·开发语言·c++·后端
小e说说28 分钟前
打破偏科困境:这些学习软件助孩子重燃学习热情
算法
南境十里·墨染春水34 分钟前
C++日志 2——实现单线程日志系统
java·jvm·c++
zh_xuan43 分钟前
api测试工具添加历史记录功能
c++·libcurl·duilib
月昤昽1 小时前
autoCAD二次开发 4.正多边形与collection区分
算法·c#·二次开发·autocad二次开发
休息一下接着来1 小时前
C++ 固定容量环形队列实现
c++·算法
im_AMBER2 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
笨笨饿2 小时前
#79_NOP()嵌入式C语言中内联汇编宏的抽象封装模式研究
linux·c语言·网络·驱动开发·算法·硬件工程·个人开发
Dabei2 小时前
Android 无障碍服务实现美团/微信自动化:客户端开发实践
前端·设计模式