行为模式---状态模式

server/2025/3/12 13:35:00/

概念

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

适用场景

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.ppmy.cn/server/174139.html

相关文章

解锁下一代开发范式:IntelliJ Idea AI插件全景实战与未来展望

1、引言&#xff1a;AI重构开发工作流 随着大语言模型&#xff08;LLM&#xff09;技术的爆发式发展&#xff0c;编程工具正经历从“辅助工具”到“智能伙伴”的质变。据开发者社区统计&#xff0c;2025年已有超80%的开发者将AI插件深度融入日常工作流&#xff0c;而IntelliJ …

在 Flask 项目中访问其他页面

&#x1f680; 在 Flask 项目中访问 introduce.html 目前你只能访问 http://localhost:8080/index.html&#xff0c;但你希望可以访问 introduce.html。 ✅ 1. 确保 introduce.html 存放在 templates/ 目录 Flask 默认会在 templates/ 目录下寻找 HTML 文件。请确保 introduc…

【商城实战(20)】商品管理功能深化实战

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…

Flink状态管理深度探索:从Keyed State到分布式快照

Flink状态管理深度探索:从Keyed State到分布式快照 在大数据实时计算领域,Apache Flink凭借其精准的状态管理能力成为行业标杆。本文将从状态管理的核心机制出发,结合金融行业PB级数据处理实践,深入解析状态后端、容错机制与大规模优化策略。 一、Flink状态管理核心架构 …

Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF

基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)

文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤&#xff08;Ollama方式&#xff09;1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…

目标检测YOLO实战应用案例100讲-基于激光雷达点云的交通场景 三维车辆目标检测与跟踪算法研究(续)

目录 基于目标框相似性度量的三维车辆目标跟踪算法 4.1 三维目标跟踪基准算法分析 4.2 基于卡尔曼滤波与目标框相似性度量的车辆目标跟踪 4.2.1 轨迹预测 4.2.2 目标框相似性度量与时序关联 4.2.3 轨迹管理 4.2.4 轨迹更新 4.3 实验与分析 4.3.1数据集 4.3…

Kafka精选面试题

1. 如何保证幂等性? 幂等性其实是消息的一致性, 生产和消费都只有一次, 所以分为生产者幂等性和消费者幂等性. 实际开发过程中, 一般只会保证消费幂等性, 所以面试时直接回答消费幂等就行 做法就是做唯一id, 在消费端做个判断,如果唯一id已存在则不做消费处理, 这个唯一id一般…