图片引用于百度
简介:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
优点:将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
缺点:状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码
例子背景:模拟线上的信息提交到审核结束
状态模式代码:
- 抽象消息审核类:
#pragma once
#include "Context.h"
class MessageModerationState
{
public:
MessageModerationState() {}
virtual ~MessageModerationState() {}
protected:
function<void(string)> m_callback = nullptr;
public:
virtual void CheckFinshed(Context* c) = 0;
virtual string ReviewProgress() = 0;
};
- 具体审核类:
#pragma once
#include "MessageModerationState.h"
class SubmitMsg : public MessageModerationState
{
public:
SubmitMsg(function<void(string)> callback);
public:
virtual void CheckFinshed(Context* c);
virtual string ReviewProgress();
};
class ModerationStateMsg : public MessageModerationState
{
public:
ModerationStateMsg(function<void(string)> callback);
public:
virtual void CheckFinshed(Context* c);
virtual string ReviewProgress();
};
class InstructionMsg : public MessageModerationState
{
public:
InstructionMsg(function<void(string)> callback);
public:
virtual void CheckFinshed(Context* c);
virtual string ReviewProgress();
};
class AuditMsgFinished : public MessageModerationState
{
public:
AuditMsgFinished(function<void(string)> callback);
public:
virtual void CheckFinshed(Context* c);
virtual string ReviewProgress();
};
- 具体审核cpp:
#include "MsgModerState.h"
SubmitMsg::SubmitMsg(function<void(string)> callback)
{
m_callback = callback;
}
void SubmitMsg::CheckFinshed(Context* c)
{
m_callback(ReviewProgress());
c->SetState(new ModerationStateMsg(m_callback));
}
std::string SubmitMsg::ReviewProgress()
{
return "提交信息";
}
ModerationStateMsg::ModerationStateMsg(function<void(string)> callback)
{
m_callback = callback;
}
void ModerationStateMsg::CheckFinshed(Context* c)
{
m_callback(ReviewProgress());
c->SetState(new InstructionMsg(m_callback));
}
std::string ModerationStateMsg::ReviewProgress()
{
return "审核信息";
}
InstructionMsg::InstructionMsg(function<void(string)> callback)
{
m_callback = callback;
}
void InstructionMsg::CheckFinshed(Context* c)
{
m_callback(ReviewProgress());
c->SetState(new AuditMsgFinished(m_callback));
}
std::string InstructionMsg::ReviewProgress()
{
return "批示信息";
}
AuditMsgFinished::AuditMsgFinished(function<void(string)> callback)
{
m_callback = callback;
}
void AuditMsgFinished::CheckFinshed(Context* c)
{
m_callback(ReviewProgress());
c->SetState(new SubmitMsg(m_callback));
}
std::string AuditMsgFinished::ReviewProgress()
{
return "审核完成";
}
- 上下文类:
#pragma once
#include <string>
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class MessageModerationState;
class Context
{
private:
MessageModerationState* m_state = nullptr;
public:
Context() {}
~Context();
public:
void SetState(MessageModerationState* s);
string GetCurrentProgress();
void CheckFinished();
};
- 上下文cpp:
#include "Context.h"
#include "MessageModerationState.h"
Context::~Context()
{
delete m_state;
m_state = nullptr;
}
void Context::SetState(MessageModerationState* s)
{
delete m_state;
m_state = nullptr;
m_state = s;
}
std::string Context::GetCurrentProgress()
{
return m_state->ReviewProgress();
}
void Context::CheckFinished()
{
m_state->CheckFinshed(this);
}
- 引用:
#include "MsgModerState.h"
int main()
{
auto fn = [](string str){ cout << "当前进度:" << str << endl; };
Context* context = new Context;
context->SetState(new SubmitMsg(fn));
context->CheckFinished();
context->CheckFinished();
context->CheckFinished();
context->CheckFinished();
delete context;
getchar();
return 0;
}
总结:
状态模式(State):允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块,当枚举可能的状态之前,需要确定状态种类。状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱,提前思考好再动手写。
作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)