行为模式---状态模式

概念

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

适用场景

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:狙击手掩护
相关推荐
鸽鸽程序猿1 天前
【项目】【在线判题系统】竞赛发布与撤销发布
状态模式
lemon_sjdk1 天前
从一段真实的 Electron IM 前端代码,看高级前端的工程化修养
前端·electron·状态模式·im
Nebula_g1 天前
云禾外卖补充—项目整体后端运行逻辑-对流程的更深层次理解
java·开发语言·网络·数据库·状态模式·javase
Wang's Blog2 天前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
Java后端的Ai之路2 天前
14、ReactJS - 路由(Router)
前端·react.js·状态模式
星恒随风2 天前
Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系
linux·运维·笔记·学习·状态模式
溪语流沙2 天前
【Web全栈进阶】前端对接新契约:信封解包 + 统一错误处理
前端·vue.js·python·状态模式·fastapi
积流成海2 天前
JSON 格式化:语法校验与错误定位实践
json·状态模式·盘子工具站
鸽鸽程序猿3 天前
【项目】【在线判题系统】竞赛新增
状态模式
const_qiu3 天前
第 2.5 章 2.5.6:前端登录、Token 无感续签与路由守卫
java·前端·人工智能·状态模式