当前位置: 首页 > article >正文

行为模式---状态模式

概念

状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态的改变而改变,使其看上去就像是类的一个属性一样。

适用场景

1、如果对象需要根据不同的状态进行不同的操作的,且状态较多并且代码需要复用的时,需要使用到状态模式。

2、如果某个类需要根据成员的状态改变自身的行为且需要大量的条件判断语句的时,可以使用该模式。

3、当相似的状态和基于条件的状态机转换中存在许多重复代码的时候,可以使用状态模式。

创建方式

1、使用状态模式的时候需要首先创建一个状态类、上下文类。

2、创建一个状态类接口对象,在这个接口对象中需要创建一个上下文指针对象,并创建一个设置上下文的接口和所有的状态操作函数。

3、创建实际的状态类对象,在实际的状态类对象实现具体的操作函数方法,在此方法中实现状态的切换。

4、实现上下文类,在上下文状态类中实现状态类的指针对象引用,并实现一个切换函数在此函数中将当前状态设置给当前上下文。然后实现上下文的操作函数。在上下文的操作函数中通过状态引用对象调用状态的操作函数。

5、在客户端的使用的时候,首先创建一个初始转台对象,之后创建一个上下文对象,并将状态对象设置个上下文,之后通过调用上下文中的操作函数进行状态切换和状态的操作函数。

类关系图

在这里插入图片描述

示例代码

#include "ZhuangTaiMoShi.h"
int main()
{
    std::cout << "欢迎东哥来到设计模式的世界!\n";
    //创建状态
    StateBase* state1 = new State1();
    StateBase* state2 = new State2();
    //创建上下文对戏
    Context* context = new Context();
    context->switchState(state1);
    context->deputeHandle1();
    context->deputeHandle2();
    context->switchState(state2);
    context->deputeHandle1();
    context->deputeHandle2();
}
#pragma once
#include <string>
#include <iostream>

using namespace std;
class Context;

//状态接口类
class StateBase
{
public:
	StateBase() {}
	~StateBase() {}
	virtual void handle1() {}
	virtual void handle2() {}
};

//具体状态接口类
class State1 : public StateBase {
public:
	State1() {}
	~State1() {}
	void handle1() {
		cout << "状态1操作函数1:第一队右侧迂回" << endl;
	}
	void handle2() {
		cout << "状态1操作函数2:第而队左侧突击" << endl;
	}
};

class State2 : public StateBase {
public:
	State2() {}
	~State2() {}
	void handle1() {
		cout << "状态2操作函数1:先锋队冲锋" << endl;
	}
	void handle2() {
		cout << "状态2操作函数2:狙击手掩护" << endl;
	}
};

//上下文对象类
class Context {
public:
	Context() {}
	~Context() {}
	void switchState(StateBase* state) {
		m_state = state;
	}
	void deputeHandle1() {
		m_state->handle1();
	}
	void deputeHandle2() {
		m_state->handle2();
	}
private:
	StateBase* m_state = nullptr;
};

欢迎东哥来到设计模式的世界!
状态1操作函数1:第一队右侧迂回
状态1操作函数2:第而队左侧突击
状态2操作函数1:先锋队冲锋
状态2操作函数2:狙击手掩护

http://www.kler.cn/a/585952.html

相关文章:

  • 目标跟踪之DeepSort算法(4)
  • 从DeepSeek探讨大语言模型在建筑及能源行业的应用趋势和技术方法(52页PPT)
  • macOS 如何进入安全模式
  • 使用multiprocessing实现进程间共享内存
  • 自定义Linux网络协议的开发与测试
  • 达梦数据库导入dmp文件:本地编码:PG_GBK, 导入文件编码:PG_UTF8 [警告]服务器与文件内数据的 CASE_SENSITIVE 参数不匹配
  • 云原生Serverless平台:无服务器计算的架构革命
  • 使用 Tesseract 进行 OCR 识别的详细指南
  • 带宽管理配置实验
  • 从零开始学习PX4源码12(模式手动控制开关消息)
  • 2.2 企业级ESLint/Prettier规则定制
  • ESP32-H2芯片模组方案,设备物联网通信,智能化无线控制联动
  • 【Nexus】Maven 私服搭建以及上传自己的Jar包
  • 稀疏矩阵(信息学奥赛一本通-2042)
  • 【Spring】详细剖析Spring程序
  • 【AWS入门】2025 AWS亚马逊云科技账户注册指南
  • 华三防火墙-HA主备模式
  • 数据结构:UNSW新南学COMP9024真题讲解
  • Redis 事务底层实现
  • Windows下安装Git客户端