行为模式---状态模式

概念

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

适用场景

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

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

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

创建方式

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

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

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

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

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

类关系图

示例代码

cpp 复制代码
#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();
}
cpp 复制代码
#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;
};
cpp 复制代码
欢迎东哥来到设计模式的世界!
状态1操作函数1:第一队右侧迂回
状态1操作函数2:第而队左侧突击
状态2操作函数1:先锋队冲锋
状态2操作函数2:狙击手掩护
相关推荐
s***P98218 小时前
Spring Boot实时推送技术详解:三个经典案例
spring boot·后端·状态模式
LSL666_21 小时前
15 时间格式的转换
状态模式·springboot·时间格式
问道飞鱼2 天前
【前端知识】从前端请求到后端返回:Gzip压缩全链路配置指南
前端·状态模式·gzip·请求头
seven_7678230982 天前
DevUI表单引擎实战:可配置化动态表单与多级联动设计
状态模式·devui·matechat
重生之我在番茄自学网安拯救世界2 天前
网络安全中级阶段学习笔记(二):网络安全暴力破解学习重点笔记
状态模式·网安基础
小雨青年2 天前
MateChat 进阶实战:打造零后端、隐私安全的“端侧记忆”智能体
前端·华为·ai·华为云·状态模式
兩尛3 天前
项目1相关八股
状态模式
unicrom_深圳市由你创科技3 天前
使用 Vue3 + Nest.js 构建前后端分离项目的完整指南
开发语言·javascript·状态模式
通义灵码3 天前
Java 后端开发工程师使用 Qoder 实现面向 API 的运维平台前端开发
java·运维·状态模式
摘星编程3 天前
基于 DevUI 与 MateChat 构建企业级 AI 智能助手的实践与探索
人工智能·华为云·状态模式