C++状态模式:State Pattern

状态模式:允许对象在其内部状态改变时改变它的行为,对象看起来好像修改类它的类。

状态模式是有限状态机(Finite State Machine)的一种实现方式。

我们都知道,http请求报文由请求行、请求头、请求空行和请求体四部分组成,服务器在解析请求报文时,会根据当前所在行的状态来进行不同方式的解析(逐行解析)。

类图:

 

实现如下:

state.h:

#ifndef STATE_H
#define STATE_H
#include <iostream>
using namespace std;

class State {
public:
    virtual void work() = 0;
};
#endif // STATE_H


requestLine.h:

#ifndef REQUESTLINE_H
#define REQUESTLINE_H
#include "state.h"

class RequestLine : public State {
public:
    virtual void work() override
    {
        cout << "解析请求行" << endl;
    }
};

#endif // REQUESTLINE_H


requestHeader.h:

#ifndef REQUESTHEADER_H
#define REQUESTHEADER_H
#include "state.h"

class RequestHeader : public State {
public:
    virtual void work() override
    {
        cout << "解析请求头" << endl;
    }
};
#endif // REQUESTHEADER_H


requestBlankLine.h:

#ifndef REQUESTBLANKLINE_H
#define REQUESTBLANKLINE_H
#include "state.h"

class RequestBlankLine : public State {
public:
    virtual void work() override
    {
        cout << "解析请求空行" << endl;
    }
};
#endif // REQUESTBLANKLINE_H


requestBody.h:

#ifndef REQUESTBODY_H
#define REQUESTBODY_H
#include "state.h"

class RequestBody : public State {
public:
    virtual void work() override
    {
        cout << "解析请求体" << endl;
    }
};
#endif // REQUESTBODY_H


httpAnalyze.h:

#ifndef HTTPANALYZE_H
#define HTTPANALYZE_H
#include "requestLine.h"
#include "requestHeader.h"
#include "requestBlankLine.h"
#include "requestBody.h"

class HttpAnalyze {
public:
    void setCurState(State* s)
    {
        m_curState = s;
    }

    void analyze()
    {
        m_curState->work();
    }
private:
    State* m_line = new RequestLine();
    State* m_header = new RequestHeader();
    State* m_blankLine = new RequestBlankLine();
    State* m_body = new RequestBody();
    State* m_curState;
};

#endif // HTTPANALYZE_H


main.cpp:

/*
 * 状态模式
 *
 * date:2023-9-16
*/

#include "httpAnalyze.h"

int main()
{
    State* line = new RequestLine();
    State* header = new RequestHeader();
    State* blankLine = new RequestBlankLine();
    State* body = new RequestBody();

    HttpAnalyze* h = new HttpAnalyze();

    cout << "开始解析请求报文" << endl;

    h->setCurState(line);
    h->analyze();

    h->setCurState(header);
    h->analyze();

    h->setCurState(blankLine);
    h->analyze();

    h->setCurState(body);
    h->analyze();

    cout << "解析完毕" << endl;

}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值