C++25设计模式之状态模式

在这里插入图片描述
图片引用于百度

简介:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

优点:将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数

缺点:状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码

例子背景:模拟线上的信息提交到审核结束

状态模式代码:

  • 抽象消息审核类:
#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(转载请说明出处)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值