「软件设计模式」状态模式(State)

状态模式设计模式实战State.zip 本文还有配套的精品资源,点击获取 简介:状态模式是一种设计模式,它允许对象根据其内部状态改变行为。该模式通过封装状态到独立的类中来增强代码的可读性和可维护性。示例代码"State.zip"详细展示了如何在实际编程中应用这一模式,包括上下文类、抽象状态类以及具体状态类的实现和交互。 1. 状态模式概念与应用场景 状态模式是一种行为设计模式,用于允许一个对象在其... 阅读详情

软件设计模式深度解析:状态模式及其C++实践

一、模式思想:行为的状态化封装

状态模式(State Pattern)是面向对象设计中的行为型模式,其核心思想是将对象的行为封装到独立的状态对象中,使得对象能根据内部状态的变化动态改变行为。该模式通过以下方式解耦程序逻辑:

  1. 将每个状态的行为抽象为独立类
  2. 允许对象在运行时切换状态对象
  3. 消除复杂的条件判断语句

模式结构图:


二、模式实现:电梯状态控制实例

2.1 基础框架搭建

#include <iostream>
using namespace std;

// 前置声明
class ClosedState;
class MovingState;
class StoppedState;

// 状态接口
class ElevatorState {
public:
    virtual void openDoors() = 0;
    virtual void closeDoors() = 0;
    virtual void move() = 0;
    virtual void stop() = 0;
    virtual ~ElevatorState() = default;
};

// 上下文环境
class Elevator {
    ElevatorState* currentState;

public:
    Elevator() : currentState(nullptr) {}

    void setState(ElevatorState* newState) {
        delete currentState; // 释放旧状态
        currentState = newState;
    }

    void openDoors() {
        currentState->openDoors();
    }
    void closeDoors() {
        currentState->closeDoors();
    }
    void move() {
        currentState->move();
    }
    void stop() {
        currentState->stop();
    }
};

2.2 具体状态实现(以开门状态为例)


// 具体状态
class OpenState : public ElevatorState {
    Elevator* elevator;

public:
    OpenState(Elevator* e) : elevator(e) {}

    void openDoors() override {
        cout << "电梯门已经是开启状态" << endl;
    }

    void closeDoors() override {
        cout << "正在关闭电梯门..." << endl;
        elevator->setState(new ClosedState(elevator));
    }

    void move() override {
        cout << "错误:门未关闭不能移动" << endl;
    }

    void stop() override {
        cout << "电梯已处于静止状态" << endl;
    }
};

class ClosedState : public ElevatorState {
    Elevator* elevator;

public:
    ClosedState(Elevator* e) : elevator(e) {}

    void openDoors() override {
        elevator->setState(new OpenState(elevator));
        cout << "电梯门已开启" << endl;
    }

    void closeDoors() override {
        cout << "电梯门已经是关闭状态" << endl;
    }

    void move() override {
        cout << "电梯开始移动..." << endl;
        elevator->setState(new MovingState(elevator));
    }

    void stop() override {
        cout << "电梯已处于静止状态" << endl;
    }
};

class MovingState : public ElevatorState {
    Elevator* elevator;

public:
    MovingState(Elevator* e) : elevator(e) {}

    void openDoors() override {
        cout << "错误:电梯移动中不能开门" << endl;
    }

    void closeDoors() override {
        cout << "电梯门已经是关闭状态" << endl;
    }

    void move() override {
        cout << "电梯已经在移动中" << endl;
    }

    void stop() override {
        cout << "电梯停止..." << endl;
        elevator->setState(new StoppedState(elevator));
    }
};

class StoppedState : public ElevatorState {
    Elevator* elevator;

public:
    StoppedState(Elevator* e) : elevator(e) {}

    void openDoors() override {
        cout << "电梯门已开启" << endl;
        elevator->setState(new OpenState(elevator));
    }

    void closeDoors() override {
        cout << "电梯门已经是关闭状态" << endl;
    }

    void move() override {
        cout << "电梯开始移动..." << endl;
        elevator->setState(new MovingState(elevator));
    }

    void stop() override {
        cout << "电梯已经处于静止状态" << endl;
    }
};

2.3 状态切换演示

int main() {
    // 创建电梯对象
    Elevator elevator;

    // 设置初始状态为停止状态
    elevator.setState(new StoppedState(&elevator));

    // 测试电梯状态转换
    elevator.openDoors();  // 电梯门已开启
    elevator.closeDoors(); // 正在关闭电梯门...
    elevator.move();       // 电梯开始移动...
    elevator.stop();       // 电梯停止...
    elevator.openDoors();  // 错误:电梯移动中不能开门

    return 0;
}

三、模式优势与适用场景

3.1 核心优势

  1. 单一职责原则:每个状态对应一个类
  2. 开闭原则:新增状态无需修改现有代码
  3. 消除巨型条件语句:将分支逻辑转化为对象
  4. 状态转换显式化:状态机清晰可见

3.2 典型应用场景

  • 对象行为随状态改变而变化的场景
  • 需要替代复杂条件状态判断语句
  • 存在大量状态相关代码且频繁变更
  • 需要清晰的状态转换控制流程

四、进阶实践技巧

4.1 状态共享优化

// 使用静态成员实现状态共享
class RunningState : public ElevatorState {
    static RunningState* instance;
    // ... 实现单例模式
};

// 上下文调用方式
elevator.setState(RunningState::getInstance());

4.2 状态转换表管理

// 使用map管理状态转换规则
unordered_map<Type, function<State*()>> transitionTable = {
    {OPEN_EVENT, [](){ return new OpenState(); }},
    {CLOSE_EVENT, [](){ return new ClosedState(); }}
};

五、模式对比与常见问题

5.1 状态模式 vs 策略模式

特性状态模式策略模式
切换机制状态自动转换客户端显式指定
对象关系状态间相互知晓策略相互独立
主要目的管理状态依赖行为灵活替换算法

5.2 常见问题解答

Q:如何处理状态间的循环依赖?
A:采用中介者模式解耦状态交互

Q:状态对象是否需要持有上下文引用?
A:推荐使用弱引用或通过参数传递

Q:如何实现状态历史追溯?
A:使用备忘录模式保存状态栈

六、总结与延伸思考

状态模式将容易失控的状态判断逻辑转化为可维护的对象结构,特别适合实现复杂的状态机。当系统存在以下特征时建议采用该模式:

  • 状态数量超过5个
  • 状态转换逻辑复杂
  • 需要频繁添加新状态
  • 存在大量重复的状态判断代码

性能优化方向:对于高频率状态切换场景,可结合对象池技术复用状态对象,避免频繁的内存分配。

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。 解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。 添加getchar();代码块解决无法查找或打开PDB文件。 错误提示: “Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。 “Pro... 阅读详情

相关推荐

PCA9548实战:从硬件连接到Linux驱动的I2C扩展全解析

本文详细解析了PCA9548 I2C多路复用器从硬件连接到Linux驱动配置的全过程。涵盖硬件引脚连接、电源去耦、地址选择等关键设计要点,以及Linux驱动加载、设备树配置和应用层编程技巧,帮助开发者高效实现I2C总线扩展。

weixin_28726391的博客 406

掌握设计模式--状态模式

状态模式有点像策略模式,最大的不同是,状态类维护着状态的流转状态模式是一种通过将对象的行为与其状态分离,使对象在不同状态下表现出不同行为的设计模式。在状态中需要显式定义状态转换逻辑,状态模式的显式状态转换逻辑适用于状态数量有限、关系明确、行为独立的场景,但在状态复杂、依赖上下文或需要动态控制的情况下,应该引入更灵活的设计方式(如状态机或规则引擎)来简化管理。可以结合具体业务需求,权衡模式的适用性和实现复杂度,选择最合适的方案。

持 开源思想,撰 必胜所学,望 勤学者,无难处 784

国产信创麒麟操作系统 (kylin v10 x86架构) 离线安装nginx步骤(亲测,超详细步骤)、修改nginx配置文件、启动、重启、关闭nginx记录(亲测有效)

国产信创麒麟操作系统 (kylin v10 x86架构) 离线安装nginx步骤(亲测,超详细步骤)、修改nginx配置文件、启动、重启、关闭nginx记录(亲测有效)

qq445829096的博客 2760

设计模式——状态设计模式(行为型)

状态设计模式是一种行为型设计模式,核心在于允许对象在内部状态改变时改变行为。它通过状态对象封装不同行为,使状态切换灵活清晰。该模式包含环境类、抽象状态类和具体状态类等角色,具有避免大量分支判断、符合单一职责和开闭原则等特点。适用于订单状态管理、流程审批等场景,其结构清晰,实现方式多样,能有效解决状态切换问题。

庄小焱 2373

Postman调试海康ISAPI接口全记录:从鉴权失败到成功修改设备名的踩坑指南

本文详细记录了使用Postman调试海康ISAPI接口的全过程,从鉴权失败到成功修改设备名的实战经验。涵盖Digest认证机制、XML请求体构造、常见错误排查及代码实现过渡,帮助开发者高效解决海康设备集成中的各种问题。

weixin_42620913的博客 660

一篇讲透:豆包、元宝、DeepSeek、Kimi、WorkBuddy,职场里到底怎么分工

这篇文章深入分析了当前主流AI工具(WorkBuddy、豆包、腾讯元宝、DeepSeek、Kimi)的特点和使用场景,帮助读者根据不同工作需求选择合适的AI助手。核心观点包括: AI工具各有所长:豆包适合快速创作初稿,元宝擅长信息检索整理,DeepSeek强于逻辑分析,Kimi专精文本处理,WorkBuddy则更适合任务推进和成果交付。 使用前需明确需求:是要创意发散、信息整理,还是任务执行?不同阶段应选用不同工具组合。 提供了6个具体职场场景的解决方案,包括文章创作、课程设计、会议纪要等,并给出详细的操作

weixin_39284145的博客 1万+

设计模式之状态模式(State)

状态模式(State)状态模式(State),在大多数的设计模式书籍中都会提及,它也是游戏程序设计中应用最频繁的一种模式。主要是因为“状态”经常被应用在游戏设计的诸多环节中,包含AI人工智能状态,账号登陆状态,角色状态等。提示:以下是本篇文章正文内容,下面案例可供参考状态模式(State),在GoF中的解释是:“让一个对象的行为随着内部状态的改变而变化而该对象也像是换了类一样”。

m0_69395323的博客 636

Android15音频进阶之解underrun与overrun思路(一百一十七)

本篇目的:Android15音频进阶之解underrun与overrun思路Underrun:发生在播放:APP准备的数据太少,导致底层没有音频数据可以播放,导致ADSP被“饿死了“,即Underrun。Overrun: 发声在录音:APP录音数据获取太慢了,导致底层录出来的数据太多了,APP播放不了,导致APP被“撑死了”,即Overrun。

Android系统攻城狮 2105

状态设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 1.简介 2.什么是状态设计模式 3.实施状态设计模式 4.何时使用状态设计模式 5. Java中的状态设计模式 6.下载源代...

最佳 Java 编程 602

【一看就会】Autoware.universe中静态绕障路线的生成逻辑

在路径行为规划中,前期根据地图和起点终点,生成了一组连续可行的路径段序列(lanelets),然后后续路径行为规划,又会进行起始点,终止点,避障绕障路径的路径规划,并且会调用route_handler中的函数,进行中心线生成,最后生成路径,后续再给速度行为规划进行速度规划。在autoware.universe的规划中,是基于规则的规划,而其中的规则又是为了解决不同场景的。而这些场景,大部分是为了解决路上障碍物(静态、动态、行人、车辆等等)。

weixin_48386130的博客 321

大模型新闻摘要生成质量评估工具

大模型新闻摘要生成质量评估工具 关键词:大模型、新闻摘要、质量评估、自然语言处理、算法 摘要:本文将探讨大模型新闻摘要生成质量评估工具的设计与应用。首先介绍大模型新闻摘要生成的背景和问题,然后深入分析质量评估的难点和重要性,接着介绍大模型的

AI天才研究院 828

软件设计模式 --状态模式

#include #include using namespace std; class War; class State { public: virtual void Prophase() {} virtual void Metaphase() {} virtual void Anaphase() {} virtual void En

高调做事,低调做人 652

芒果YOLOv5改进55:损失函数篇之KLD:即插即用 芒果首发原创新颖|全网唯一更新KLD改进博客,通过 Kullback-Leibler 散度学习用于目标检测的高精度边界框,提升YOLOv5小目标

YOLOv5改进KLD损失函数:即插即用 原创新颖|芒果专栏独家首发

包括YOLOv5、YOLOv7、YOLOv8等模型改进 663

设计模式-状态模式 State

状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。状态设计模式是一种行为型设计模式,它允许对象在其内部状态发生变化时改变其行为。这种模式可以消除大量的条件语句,并将每个状态的行为封装到单独的类中。上下文(Context):上下文通常包含一个具体状态的引用,用于维护当前状态。上下文委托给当前状态对象处理状态相关行为。抽象状态(State):定义一个接口,用于封装与上下文的特定状态相关的行为。具体状态(Concrete State):实现抽象状态接口,为具体状态定义行为。

weixin_46926189的博客 2572

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【软件设计模式之状态模式】

状态模式作为一种行为型设计模式,对于管理对象在不同状态下的行为变化提供了一种优雅和系统化的方法。它通过将状态的变化封装在状态对象中,从而使得上下文对象可以在不同状态下展现不同的行为,而不需要大量的条件判断语句。这不仅使得代码更加清晰,还大大提高了代码的可维护性。状态模式是一种行为设计模式,它主要用于管理一个对象在其内部状态改变时的行为变化。这种模式允许对象在运行时根据其内部状态改变其行为方式,看起来就好像该对象的类已经改变了一样。

武帝为此的博客 2067

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

状态模式(State Pattern)

APP 抽奖活动问题 请编写程序完成APP 抽奖活动具体要求如下: 假如每参加一次这个活动要扣除用户50 积分,中奖概率是10% 奖品数量固定,抽完就不能抽奖 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完 活动的四个状态转换关系图(下图) 状态模式基本介绍 基本介绍 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换 当一个对象的内在状态改变时,允许改变其行为,这个对

笔记别偷看 6334

设计模式:状态模式(State)

设计模式:状态模式(State)

ProgramNovice的博客 1686

状态模式(State)

状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变其行为,看起来就像是改变了它所属的类。状态模式的核心思想是将对象的状态封装成不同的状态类,对象在不同状态下表现出不同的行为,从而使得对象的行为在不同状态之间更加灵活和可控。

无简介 5355

浅谈State状态模式

一、前言 状态模式在某些场合中使用是非常方便的,什么叫做状态,如果大家学过《编译原理》就会明白DFA M和NFA M,在确定有限状态机和非确定有限状态机中,状态就是最小的单元,当满足某种条件的时候,状态就会发生改变,我们可以把时间中的一个时刻当做一个状态,那么其实整个社会都是有状态组成的,前一时刻到下一时刻,整个社会上的物质(空间)发生了什么样的变化,因此状态可以非常的大也可以非常的小...

学Java,找哪吒 5717

状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用:代码中...

ThinkWon的博客 5035

【设计模式二十三之状态StatePattern模式】状态模式StatePattern

解释器模式细说解释器模式细说解释器模式定义UML模型基于UML的代码场景一场景代码场景二场景代码解释器模式应用和注意事项 细说解释器模式 提示: 博主:章飞 _906285288的博客 博客地址:http://blog.youkuaiyun.com/qq_29924041 细说解释器模式 定义 UML模型 基于UML的代码 场景一 场景 代码 场景二 场景 代码 解释器模式应用和注意事项 欢迎继续...

章飞 _906285288的博客 886

C++设计模式之状态模式(state)(行为型)

一 定义 状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把不同状态的操作分散到不同的状态对象里去完成。在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样...

janeqi1987的专栏 4411

状态模式-State Pattern

在软件开发过程中,应用程序中的有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态会发生改变,从而使得其行为也随之发生改变。如人的情绪有高兴的时候和伤心的时候,不同的情绪有不同的行为,当然外界也会影响其情绪变化。 对这种有状态的对象编程,传统的解决方案是:将这些所有可能发生的...

心猿意碼 4163

Matlab状态模式(State)

状态模式就是将状态的条件判断语句转化成其函数重写形式,利用了面向对象语言的多态性,本文根据https://blog.youkuaiyun.com/lm324114/article/details/78819602的情景将状态模式用Matlab语言实现。 根据上图情景,用传统的方法实现如下: RoomState.m classdef RoomState < handle enumera...

alim2012的博客 4293

状态模式(StatePattern)

状态模式

明明明的博客 1248
上一篇: 「软件设计模式」策略模式(Strategy)
下一篇: 「软件设计模式」命令模式(Command)
There Is No Code
博客等级 码龄10年 254粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

There Is No Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值