状态模式:允许对象在其内部状态改变时改变它的行为,对象看起来好像修改类它的类。
状态模式是有限状态机(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;
}
运行结果: