行为模式---状态模式

概念

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

适用场景

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:狙击手掩护
相关推荐
NoneCoder2 小时前
工程化与框架系列(34)--前端重构技巧指南
前端·重构·状态模式
Gazer_S18 小时前
【前端文件下载实现:多种表格导出方案的技术解析】
前端·javascript·状态模式
找了一圈尾巴3 天前
设计模式-观察者模式、状态模式
观察者模式·设计模式·状态模式
seven97_top3 天前
【设计模式】探索状态模式在现代软件开发中的应用
java·设计模式·状态模式
香菇滑稽之谈3 天前
状态模式的C++实现示例
c++·设计模式·状态模式
Hello.Reader6 天前
在 Rust 中实现面向对象的状态模式
开发语言·rust·状态模式
阿珊和她的猫7 天前
SyntaxError: Invalid or unexpected token in JSON at position x
json·状态模式
NoneCoder7 天前
工程化与框架系列(22)--前端性能优化(中)
前端·性能优化·状态模式
阿珊和她的猫7 天前
RangeError: Radix must be an integer between 2 and 36
状态模式