行为模式---状态模式

embedded/2025/3/12 8:38:09/

概念

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

适用场景

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/embedded/171987.html

相关文章

在 CentOS 上,常用几种方法来确保 Python 脚本在断开终端后继续运行

在 CentOS 上&#xff0c;你可以使用以下几种方法来确保 Python 脚本在断开终端后继续运行&#xff1a; 1. 使用 nohup 命令 nohup 命令可以让进程在终端关闭后继续运行。 nohup python main.py > output.log 2>&1 &nohup&#xff1a;忽略挂断信号&#xff0c…

手势即命令:基于 OpenCV 和 MediaPipe 的智能关机系统

前言 有没有遇到过这样的场景:加班到深夜,鼠标在桌面上划半天,却无法点到关机按钮?又或者,朋友借用电脑,怕其乱翻,只希望一个手势便触发关机操作?不必担心,今天我们用 OpenCV + MediaPipe 打造一款“手势即命令”的智能关机系统,只需轻抬手指,电脑便乖顺应命令。这…

使用dify的api连接外部知识库,dify连接ragflow的知识库(附java代码)

dify的知识库一般般,但是ragflow的知识库很强大,今天教大家如何使用dify连接ragflow的知识库 一.ragflow的准备工作 1.在ragflow建立一个知识库,拿到知识库的id,红框圈出来的地方就是这个知识库的id,后面要用到 2.拿到ragflow的api的key 二.写代码,将ragflow的接口返回的内容…

Leetcode-146.LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1 …

【RabbitMQ】事务

事务的简单配置及使用 配置事务管理器声明队列生产者代码测试 RabbitMQ是基于AMQP协议实现的&#xff0c;该协议实现了事务机制&#xff0c;因此RabbitMQ也支持事务机制. SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的&#xff0c…

鸿蒙系统中的持续部署

鸿蒙操作系统&#xff0c;作为一款面向未来的分布式操作系统&#xff0c;旨在为不同的设备提供统一的操作系统平台。它支持多种终端设备&#xff0c;包括但不限于智能手机、平板电脑、智能穿戴设备和物联网&#xff08;IoT&#xff09;设备等&#xff0c;并且能够实现跨平台的无…

通过AudioTrack计算剩余播放时间的实现

在Android中&#xff0c;通过AudioTrack计算剩余播放时间的关键步骤如下&#xff1a; 1. 核心思路 已播放帧数&#xff1a;通过getPlaybackHeadPosition()获取当前播放的音频帧数&#xff08;需注意32位溢出问题&#xff09;。 剩余帧数&#xff1a;总帧数&#xff08;数据总量…

Phi-4-multimodal:图、文、音频统一的多模态大模型架构、训练方法、数据细节

Phi-4-Multimodal 是一种参数高效的多模态模型&#xff0c;通过 LoRA 适配器和模式特定路由器实现文本、视觉和语音/音频的无缝集成。训练过程包括多阶段优化&#xff0c;确保在不同模式和任务上的性能&#xff0c;数据来源多样&#xff0c;覆盖高质量网络和合成数据。它的设计…