设计模式: 行为型之中状态模式(20)

设计模式C++实现(16)——状态模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

状态模式概述

  • 状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为
  • 状态模式通过为每个状态定义一个类,使得对象在其内部状态改变时,可以改变其行为

状态模式应用

// 定义状态接口
interface State {
  handle(context: Context): void;
}

// 定义上下文类
class Context {
  private currentState: State;

  constructor(initialState: State) {
    this.currentState = initialState;
  }

  public setState(state: State): void {
    this.currentState = state;
  }

  public request(): void {
    this.currentState.handle(this);
  }
}

// 创建具体状态类
class ConcreteStateA implements State {
  handle(context: Context): void {
    console.log('Handling in ConcreteStateA');
    // 根据业务逻辑决定切换状态
    context.setState(new ConcreteStateB());
  }
}

class ConcreteStateB implements State {
  handle(context: Context): void {
    console.log('Handling in ConcreteStateB');
    // 根据业务逻辑决定切换状态
    context.setState(new ConcreteStateA());
  }
}

// 使用示例
function main() {
  const context = new Context(new ConcreteStateA());
  context.request(); // 输出:Handling in ConcreteStateA
  context.request(); // 输出:Handling in ConcreteStateB
  context.request(); // 输出:Handling in ConcreteStateA
}

main();
  • 在上述示例中,实现了一个简单的状态模式,模拟了一个根据内部状态变化而改变自身行为的系统
  • 首先,我们定义了一个 State 接口,它要求所有的状态类必须实现一个 handle 方法
  • 这个方法接受一个 Context 参数,当状态发生变化时,handle 方法将被执行,并且可以改变上下文对象的当前状态
  • 然后,我们创建了一个 Context 类,它拥有一个私有变量 currentState 来保存当前的状态对象,并提供 setState 方法来改变当前状态,以及一个 request 方法来触发状态处理
  • 当调用 request 方法时,它会调用当前状态对象的 handle 方法
  • 接下来,我们创建了两个实现了 State 接口的具体状态类:ConcreteStateA 和 ConcreteStateB
  • 每个状态类的 handle 方法中根据业务逻辑处理当前请求,并可能通过调用 context.setState 方法改变上下文的当前状态
  • 最后,我们通过一个 main 函数展示了如何使用状态模式
  • 创建了一个 Context 对象并初始化为 ConcreteStateA,然后连续三次调用 request 方法
  • 每次调用都会依据当前状态对象的 handle 方法来处理请求,并在处理过程中切换状态
  • 这个示例展示了状态模式的核心概念,即根据内部状态的不同,对象可以有不同的行为表现
  • 在这种情况下,每次请求都会引发状态的切换,并执行新的状态对象所定义的行为
  • 这个示例展示了状态模式的核心概念,即根据内部状态的不同,对象可以有不同的行为表现
  • 在这种情况下,每次请求都会引发状态的切换,并执行新的状态对象所定义的行为

状态模式与状态机(State Machine)有着密切的关系

  • 状态模式是一种面向对象的设计模式,它将对象的状态和行为分离,使得对象在不同的状态下表现出不同的行为
  • 状态模式的关键在于,每个状态都对应一个类,类中包含了状态转换的逻辑
  • 状态机(Finite State Machine, FSM) 是一种理论模型,描述了一个系统如何根据输入和当前状态转换到下一个状态
  • 状态机包括状态、事件和状态转移函数三个基本要素
  • 状态模式是实现状态机的一种方式,它通过类的实例来表示状态,通过上下文对象来触发状态之间的转换
  • 在上述示例中,Context 类相当于状态机中的主体,其内部维护了当前的状态
  • State 接口以及 ConcreteStateA 和 ConcreteStateB 类则分别代表状态机中的不同状态,它们包含处理请求的方法,并在内部决定了何时以及如何进行状态转换
  • 通过这种方式,状态模式实现了状态机的功能,使得状态切换和行为变化变得清晰且易于维护
  • 状态模式是实现状态机概念的一种方式,它将状态机的理论应用到了面向对象编程的实际设计中
  • 严格来说,状态模式与状态机不是同一回事,但它们密切相关,可以认为状态模式是在软件设计中对状态机概念的具体实现
  • 所以,更精确的说法应该是:“状态模式是对状态机概念的一种实现方式”

状态模式的优缺点


1 ) 优点

  • 封装转换规则:状态模式将状态的转换逻辑封装在状态类中,使得状态变化更加清晰和可维护
  • 扩展性良好:通过引入新的具体状态类,可以方便地扩展系统的功能,满足开闭原则,即在不修改上下文类代码的情况下增加新的状态类
  • 提高可读性:状态模式将状态的判断逻辑分散到具体状态类中,避免了大量的条件语句,使得代码更加清晰和易于理解
  • 减少对象数量:状态模式允许多个环境对象共享一个状态对象,从而减少了系统中对象的个数,提高了资源利用效率

2 )缺点

  • 增加系统复杂性:状态模式引入了多个状态类,可能导致系统的复杂性增加,尤其是在状态转换逻辑复杂的情况下
  • 状态转换逻辑不清晰:如果状态转换的逻辑不够清晰,可能会导致状态切换的错误或不完整,增加了出错的可能性
  • 开闭原则支持不够:虽然状态模式在一定程度上支持开闭原则,但增加新的状态类时可能需要修改负责状态转换的源代码,否则无法切换到新增状态
  • 可能导致代码混乱:状态模式的结构与实现都较为复杂,如果使用不当,可能导致程序结构和代码的混乱,增加系统设计的难度

3 )总结

  • 因此,在使用状态模式时,需要根据具体的应用场景来评估其适用性
  • 在状态变化较为简单且有限的情况下,可能不需要引入状态模式
  • 而在状态变化复杂且需要灵活扩展的情况下,状态模式可以提供一种清晰和可维护的设计方案

状态模式和备忘录模式的区别和联系

  • 状态模式和备忘录模式都是面向对象设计中的重要模式
  • 它们在处理对象的状态和行为方面各有特色,但也存在一些联系

1 )区别

  • 关注点不同:

    • 状态模式关注的是对象在其内部状态改变时行为的改变
    • 它允许对象根据当前状态来改变其行为,使得对象的行为与其状态紧密绑定
    • 而备忘录模式则关注的是在不破坏封装性的前提下
    • 捕获并保存一个对象的内部状态,以便以后能将对象恢复到该状态
    • 它提供了一种机制,使得用户能够撤销操作或恢复数据到之前的状态
  • 应用场景不同

    • 状态模式常用于一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为的情况
    • 例如,一个订单系统,订单的状态可能是待支付、已支付、已发货等,不同的状态下订单的处理逻辑是不同的
    • 而备忘录模式则常用于需要保存对象状态以便后续恢复的场景,如撤销操作、游戏存档等

2 )联系

  • 虽然状态模式和备忘录模式在关注点和应用场景上有所不同,但它们都涉及到对象的状态管理
  • 在某些复杂的系统中,这两种模式可能会结合使用,以更好地管理对象的状态和行为
  • 例如,在一个复杂的游戏系统中
    • 角色可能具有多种状态,如空闲、移动、攻击等,每种状态下角色的行为都有所不同
    • 这可以通过状态模式来实现。同时,为了支持玩家的撤销操作或存档功能
    • 可能需要使用备忘录模式来保存角色在某个时刻的状态
    • 这样,当玩家需要撤销某个操作或恢复存档时,系统可以利用备忘录模式保存的状态信息
    • 将角色恢复到之前的状态

3 )总结

  • 因此,可以说状态模式和备忘录模式在对象状态管理方面具有一定的联系
  • 它们可以结合使用,以提供更强大和灵活的状态管理功能
  • 需要注意的是,具体是否使用这两种模式,以及如何使用
  • 还需要根据具体的业务需求和设计目标来决定
  • 在实际应用中,应根据具体情况权衡利弊,选择最适合的模式或模式组合
C++设计模式20:状态模式 状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。在状态模式中,对象的类行为是基于它的状态而变化的,这使得它看起来像是改变了它的类。状态模式的核心思想是将对象的行为和状态分离开来,将每种状态封装成一个类,并且使得状态之间可以相互转换。这样,在对象内部状态改变时,它的行为也会发生相应的改变。状态模式通常涉及到以下几个角色:(1) Context(上下文):定义客户端感兴趣的接口,同时维护一个当前状态的引用。 阅读详情

相关推荐

Microsoft Defender防病毒扫描添加排除项

Win10与Win11上的“**Microsoft Defender防病毒**”功能默认会自动扫描所有非压缩文件,如果发现病毒或疑似病毒甚至经过手动修改后某些安装文件,会自动将其删除,如果是后面两种情况,则可能会造成误报,对我们正常办公或学习造成不利影响。 此时, 我们可以将某个目录或文件设置为“**Microsoft Defender防病毒不会扫描已排除的项目**”(<red>但要注意:这些被排除的目录或文件会给笔记本造成一定的安全风险,如果真有病毒感染这些目录或文件它们也不会被“**Micr

weixin_42148668的博客 6484

【Java教程】Day20-20 设计模式:行为型模式——状态模式

状态模式(State Pattern)是一种常见的行为型设计模式,适用于对象的行为受其内部状态的影响的场景。该模式的核心思想是允许对象在其内部状态改变时改变其行为,使得对象看起来仿佛修改了它的类。 我们以一个常见的示例——即时通讯软件QQ的用户状态来说明这一点。用户的状态可能是:离线、在线、忙碌等,不同的状态下,用户的行为会有所不同。

max202011161630的博客 1111

手把手教你用VS Code + Codex在WSL中高效编程(避坑指南)

本文提供了一份详细的避坑指南,教你如何在WSL环境中高效配置和使用VS Code与OpenAI Codex。文章核心在于解决WSL内Codex扩展的OAuth登录失败问题,推荐将扩展安装在Windows本地,并通过UNC路径直接访问WSL文件系统,从而实现AI辅助编程与Linux开发环境的无缝结合,提升编码效率。

weixin_28677451的博客 1069

【从零入门23种设计模式20】行为型之状态模式

摘要:状态模式是一种行为型设计模式,允许对象在内部状态改变时改变其行为。该模式通过将每种状态封装为独立类,消除大量if/else判断,实现状态与行为的解耦。核心角色包括环境类(维护当前状态)、抽象状态接口和具体状态类。典型应用场景包括订单状态流转、电梯运行状态等。状态模式优点在于消除分支判断、提高扩展性,但可能增加类数量。与策略模式的区别在于,状态模式关注内部状态驱动的行为变化,而策略模式关注外部算法的替换。该模式在Spring状态机、JDBC连接等场景中都有应用。

2401_87662859的博客 681

SMPTE ST 2110 概论(三)

SMPTE ST 2110 概论(三)ST 2110-30:未压缩的PCM音频流ST 2110-31:非PCM音频传输ST 2110-40:辅助数据传输结语 ST 2110-30:未压缩的PCM音频流 鉴于音频系统是广播系统中最复杂,也是最重要的一套系统,我们先来回顾一下广电音频系统的历史。 最老式的音频都是基于模拟信号的,具有有限的动态范围,并且用连续的电压变化来描述音频。再后来就基于数字信号(...

Cidd0422的博客 1万+

Matlab双目相机标定

1 概述 现在有许多双目相机在出厂时就已经标定好了,用户拿到手后可以直接使用,例如Intel Realsense系列。但是有些相机出厂的时候并没有完成标定工作,因而这个时候就需要我们自己来标定。由于笔者曾改装过一个双目相机,最远可以测至50m,因此有一定的心得体会想给大家分享一下。本文主要介绍双目相机标定的整个过程,以及导出标定数据的方法。 相机标定主要分为手动标定和自动标定,手动标定比较繁琐,这里主要介绍基于matlab工具箱的自动标定方式来对双目相机进行标定。具体的相关标定细节也可以参照这篇博客:m

weixin_46133643的博客 2万+

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

状态模式(State Pattern)属于行为型设计模,也叫作状态机模式(StateMachine Pattern),对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。状态模式中类的行为是由状态决定的,在不同的状态下有不同的行为。其意图是让一个对象在其内部改变的时候,行为也随之改变。状态模式的核心是状态与行为绑定,不同的状态对应不同的行为。

tszc95的博客 2604

基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践

本文详细介绍了基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践。通过环境配置、PX4仿真环境搭建、自定义消息生成、Simulink通信实现及实时优化等步骤,提供了完整的无人机位置控制案例,帮助开发者实现高精度的实时联合仿真。

red88的博客 204

C++ 设计模式——状态模式

状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态发生变化时,动态地改变其行为。该模式的核心在于将状态相关的行为封装到独立的状态类中,使得对象的行为随状态而变化,从而减少冗余的条件判断。

慢慢记录,慢慢更新。 2148

微调实操一: 增量预训练(Pretraining)

《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代码比较难以理解,而且模型只能从hugging face上下载,对于一些国内服务器无法访问,我重构了代码,让训练代码更有可读性,并参考LLAMAFactory的项目,增加了modelscope上下载模型,轻松在国内服务器运行.

youbingchen的博客 6993

Windows Server 2016远程桌面服务配置和授权激活

Server 2016默认远程桌面连接数是2个用户,如果多余两个用户进行远程桌面连接时,系统就会提示超过连接数,可以通过添加远程桌面授权解决:1、添加远程桌面授权服务第一步:服务器管理 - 添加角色和功能打开添加角色和功能向导窗口,选择基于角色或给予功能安装:第二步:添加远程桌面会话主机和远程桌面授权功能:以上配置完成后即可使用多于2用户同时登陆,但使用期限为120天,再次登陆会有如下提示:2、添...

mahailiang的专栏 6万+

设计模式——状态模式

在现实生活中,常常会出现这样的事例:一个人的情绪高兴时,会做出一些助人为乐的事情。情绪低落的时候,会做出一些伤天害理的事情。这里的情绪就是状态,对应做的事情就是行为。在软件开发中也是类似的,有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态会发生改变,从而使得其行为也随之发生改变。 一、基本介绍 【1】状态(State)模式的定义:对有状态的对象,把复杂的 “判断逻辑” 提取到.

程序猿进阶 3984

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

设计模式 20 状态模式

状态模式的核心思想是将与状态相关的行为封装在独立的状态对象中,并通过状态对象来管理对象的状态转换。这样,原始对象在其状态发生变化时,会自动切换到对应的状态对象,从而表现出不同的行为。状态模式通过将状态相关的行为封装在独立的状态对象中,简化了对象的状态管理逻辑。它消除了大量的条件分支语句,使代码更加清晰和易于扩展。尽管状态模式可能会增加类的数量,但它为管理复杂的状态转换逻辑提供了一种灵活且有效的解决方案。

Winemonk 1628

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++设计模式_行为型模式_状态模式State

状态(State)模式是一种行为型模式,其实现可完成类似有限状态机的功能。换句话说,一个对象可以处于多种不同的状态(当然,同一时刻只能处于某一种状态),从而让对象产生不同的行为。通过状态模式可以表达出这些不同的状态并实现对象在这些状态之间的转换。状态模式最突出的特点是用类来表示状态,这一点与策略模式有异曲同工之妙(策略模式是用类来表示策略)。状态模式与策略模式从UML图上看完全相同,只不过两者所运用的场合以及所表达的目的不同。

weixin_43916755的博客 1082

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

笨蛋学设计模式行为型模式-状态模式【20】

比如在设计一个电梯系统时,可以使用状态模式来管理电梯的不同状态,如开门、关门、上升、下降等。将电梯的这几种状态封装成一个独立的状态类,并定义了该状态下的具体行为,通过将状态切换的逻辑分布到各个状态类中,可以使得电梯的状态切换更加清晰、易于维护和扩展。

YSL_Monet的博客 1355

Java二十三种设计模式-状态模式(20/23)

(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。状态模式是一种行为型设计模式,允许一个对象在其内部状态改变时改变其行为。对象看起来似乎修改了其类。统一接口:确保所有状态类都遵循统一的状态接口,使得状态转换和行为调用标准化。

小相探索IT世界 1581

[学习笔记:设计模式] 20_状态模式

状态模式

qq_59896820的博客 1337

C++设计模式之状态模式

-- 第20种设计模式; 状态模式(State Pattern)是⼀种行为型设计模式,它适⽤于⼀个对象在不同的状态下有不同的行为时,⽐如说电灯的开、关、闪烁是不停的状态,状态不同时,对应的行为也不同,在没有状态模式的情况下,为了添加新的状态或修改现有的状态,往往需要修改已有的代码,这违背了开闭原则,而且如果对象的状态切换逻辑和各个状态的行为都在同⼀个类中实现,就可能导致该类的职责过重,不符合单⼀职责原则。

K1_uestc的博客 2451

《Head First 设计模式》第十章-状态模式 状态模式

状态模式 策略模式和状态模式是双胞胎,在出生时才分开。你已经知道,策略模式是围绕可以互换的算法来创建成功业务的,然而,状态走的是更崇高的路,它通过改变对象内部的状态来帮助对象控制自己的行为。 定义状态模式 先看看定义:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类 例题 自动糖果售卖机,糖果机的控制器需要的工作流程如下图 从上面的状态图中可以找到所有的状态...

少说,多做。 4013

C++20之设计模式:状态模式

首先,这是值得强调的Boost.MSM是Boost中两种状态机实现之一,另一种是。我很确定还有很多其他的状态机实现。其次,状态机的功能远不止这些。例如,许多库支持分层状态机的思想:例如,一个生病(Sick)的状态可以包含许多不同的子状态,如流感(Flu)或水痘(Chickenpox)。如果你在处于感染流感的状态,你也同时处于生病的状态。最后,有必要再次强调现代状态机与状态设计模式的原始形式之间的差异。重复api的存在(例如)以及自删除的存在在我的书中是明确的代码气味。

weixin_51332735的博客 2648

设计模式精讲 Day 20:状态模式(State Pattern)

状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。该模式将状态相关的行为封装到不同的状态类中,使得对象的行为随着状态的变化而变化,而无需显式的条件判断语句。状态模式的核心思想是将对象的状态行为封装为独立的类。通过上下文对象统一管理状态转换,实现行为与状态的解耦。状态模式适用于多状态、行为变化频繁的场景。通过完整 Java 示例,展示了状态模式的实现方式和实际应用。状态模式与策略模式、命令模式等存在相似之处,但在应用场景上有明显区别。

在未来等你的专栏 1223

DesignPattern_状态模式_20

状态模式 定义 Allow an object to alter its behavior when its internal state changes.The object will appear tochange its class. 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。 State——抽象状态角色 接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。 ConcreteState——具体状态角色 每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状

qq_38438909的博客 128

设计模式20 - 状态模式

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 状态模式 使用场景 优缺点 注意事项 UML结构图 代码实现 ...

billy的博客 288

【Java开发】设计模式 20:状态模式

即一个对象在其内部状态改变时,会导致其行为的改变。状态模式将对象的所有状态都抽象成为一个状态类,对象在不同状态下具有不同的行为。这种设计模式的核心思想是将各种状态分离,并将状态转移的逻辑分离。这样可以让状态改变时避免重复的if...else...语句,使代码更加清晰简洁。

尹煜的博客 630
上一篇: 设计模式: 行为型之中观察者模式(19)
下一篇: 设计模式: 行为型之中迭代器模式(21)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Wang's Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值