设计模式-状态模式 Java

Java架构-状态机如何实现 先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed。状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。例如,根据自动门的运行规则,我们可以抽象出下面这么一个图。 阅读详情

模式概述

状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。这种模式通过将各种状态对应的行为分割到不同的状态子类中,使得对象可以根据当前状态表现出不同的行为,并且状态转换变得更加清晰和可维护。

简单代码示例

// 抽象状态
interface FanState {
    void turnUp(FanContext context);
    void turnDown(FanContext context);
    void printState();
}

// 具体状态:关闭
class OffState implements FanState {
    @Override
    public void turnUp(FanContext context) {
        context.setState(new LowState());
        System.out.println("风扇从【关闭】转为【低档】");
    }
    
    @Override
    public void turnDown(FanContext context) {
        System.out.println("风扇已经关闭,无法再调低");
    }
    
    @Override
    public void printState() {
        System.out.println("当前状态:关闭");
    }
}

// 具体状态:低档
class LowState implements FanState {
    @Override
    public void turnUp(FanContext context) {
        context.setState(new HighState());
        System.out.println("风扇从【低档】转为【高档】");
    }
    
    @Override
    public void turnDown(FanContext context) {
        context.setState(new OffState());
        System.out.println("风扇从【低档】转为【关闭】");
    }
    
    @Override
    public void printState() {
        System.out.println("当前状态:低档");
    }
}

// 具体状态:高档
class HighState implements FanState {
    @Override
    public void turnUp(FanContext context) {
        System.out.println("风扇已经是最高档,无法再调高");
    }
    
    @Override
    public void turnDown(FanContext context) {
        context.setState(new LowState());
        System.out.println("风扇从【高档】转为【低档】");
    }
    
    @Override
    public void printState() {
        System.out.println("当前状态:高档");
    }
}

// 上下文
class FanContext {
    private FanState currentState;

    public FanContext() {
        this.currentState = new OffState(); // 初始状态
    }

    public void setState(FanState state) {
        this.currentState = state;
    }
    
    public FanState getState() {
        return currentState;
    }

    // 对外暴露的方法,相当于"事件"
    public void pressTurnUpButton() {
        currentState.turnUp(this);
    }
    
    public void pressTurnDownButton() {
        currentState.turnDown(this);
    }
    
    public void printStatus() {
        currentState.printState();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        FanContext fan = new FanContext();
        fan.printStatus(); // 初始状态
        
        fan.pressTurnUpButton(); // 从关闭调高到低档
        fan.printStatus();
        
        fan.pressTurnUpButton(); // 从低档调高到高档
        fan.printStatus();
        
        fan.pressTurnUpButton(); // 尝试从高档继续调高
        fan.printStatus(); // 状态不变
        
        fan.pressTurnDownButton(); // 从高档调低到低档
        fan.printStatus();
        
        fan.pressTurnDownButton(); // 从低档调低到关闭
        fan.printStatus();
        
        fan.pressTurnDownButton(); // 尝试从关闭继续调低
        fan.printStatus(); // 状态不变
    }
}

技术细节

1.模式组成

组件职责说明
环境类也称为上下文,定义客户端需要的接口。它维护一个State子类的实例,这个实例定义了对象的当前状态
抽象状态类定义一个接口,用以封装Context对象的特定状态所对应的行为
环境类每一个子类实现一个与Context的一个状态相关的行为。每一个具体状态类对应Context的一个具体状态

2.优缺点

优点:

清晰的结构:将与特定状态相关的行为局部化到一个状态子类中,将不同状态的行为分割开来,满足了单一职责原则。

除庞大的条件分支语句:避免了在上下文类中编写冗长复杂的条件状态判断语句。

缺点:

结构复杂:对开闭原则的支持并不完美。虽然增加新状态很容易,但修改状态转换逻辑(比如一个事件能触发哪些状态变化)可能需要修改多个状态类的代码。

和策略模式区别

虽说两种设计模式类图结构上几乎一模一样,但它们的意图和解决的问题完全不同。

  • 当需要灵活地切换多种算法来完成一个任务时,用策略模式。它是“主动”的,由客户端控制。
    类比:你要去旅行,可以选择不同的策略(交通工具):飞机、高铁、自驾。你根据成本、时间等因素主动选择其中一种,这些方式之间 没有必然联系,你也不会因为上了飞机就自动变成高铁。
  • 当有一个对象,其行为主要由内部状态决定,并且状态会随着其操作而改变时,用状态模式。它是“被动”的,状态转换对客户端是透明的。
    类比:电视遥控器有状态:开机状态、关机状态、静音状态。你按“电源”键,这个行为的结果取决于当前状态。在开机状态下按,会关机;在关机状态下按,会开机。状态的转换是由触发的事件(按按钮)和当前状态共同决定的,不是你显式地“选择”一个状态。

模式应用

Spring官方提供了一个名为Spring State Machine的子项目,它专门用于帮助开发者将状态机模式应用到Spring应用中

java设计模式之状态模式(State Pattern) 该模式通过将不同状态下的行为封装到独立的类中,使得状态转换更加清晰,避免了复杂的条件判断。:每个状态类在行为方法中自行决定后续状态(分散管理,更符合单一职责)。:处理订单状态(待支付、已支付、已发货、已完成)。:通过封装状态及其转换逻辑,使代码更易维护和扩展。:将状态行为委托给独立对象,环境类仅维护当前状态。:控制流程节点状态(审批中、已通过、已驳回)。每个状态类封装对应行为,并处理状态转换逻辑。:适用于对象行为随状态变化且状态较多的场景。:例如订单状态(待支付、已支付、已发货)。:避免在代码中频繁使用。 阅读详情

相关推荐

【Java设计模式】Java设计模式之(十二)状态模式(State Pattern)

状态模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象,类的行为是基于它的状态改变的。 一、状态模式介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用:代码中包含大量与对象状态有关的条件语句。 如何解决:将各种具体的状态类抽象出来。 关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有

No8g攻城狮的博客 819

Java中状态机

状态机(State Machine)是一种数学模型,用于描述对象或系统在不同状态之间的转移和行为。它由一组状态、转移条件和动作组成,可以根据输入条件从一个状态转移到另一个状态,并执行相应的动作。离散性:状态机是离散的,它的状态和转移是离散的,不涉及连续变化。易于理解和建模:状态机可以直观地描述对象或系统的行为,使得人们能够更好地理解和建模复杂的逻辑。可扩展性:状态机可以轻松地添加新的状态和转移,以适应需求的变化。

iaoyou1的博客 5383

Java设计模式之状态模式(State模式)介绍

主要介绍了Java设计模式之状态模式(State模式)介绍,本文讲解了何时使用状态模式、如何使用状态模式等内容,需要的朋友可以参考下

java设计模式学习之【状态模式】

这篇教程不仅提供了状态模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 2952

Delphi解决 openssl DLL 与 Indy 的SSL/TLS 连接问题

​ 使用 SSL 连接时出错。错误 1409442E:SSL 例程:ssl3_read_bytes:tlsv1 警报协议版本 由于我使用的是最新版本的Indy,根据Delphi Praxis 上的此线程,这种情况不应该发生。事实证明,不知何故,一个非常旧版本的 openssl DLLlibeay32.dll和ssleay32.dll已被放置在我计算机上的 sarch 路径中(版本 1.0.0e)。

Delphi开发局QQ群:32422310 2494

使用Tansformer分割三维腹部多器官--UNETR实战

不会 transformer 没关系,本教程开箱即用。Tina姐总算对transformer下手了,之前觉得难,因为刚开始学序列模型的时候就没学会。然后就一直排斥学transformer。这两周没什么事,加上MONAI有现成的教程,就打算先跑通后,再学理论。然后,顺利的跑通了代码,再学了一周理论,发现它也不过如此嘛,入门还是很容易的。有同学想了解的transformer的话,可以先看完这个实战教程,如果感兴趣,后续会出一个transformer入门路线。利用纯Transformers作为编码器来学习输入量的

Tina姐的博客 1万+

20.状态模式

状态模式 一、状态模式 1.状态模式 1)状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换 2)当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类 2.原理类图 1)Context 类为环境角色,用于维护State实例,这个实例定义当前状态 2)State是抽象状...

weixin_30835923的博客 308

滤波器初步入门(非常全面)

主要关注的是-3dB这个点,-3dB就是截止频率所对应的点,我们把功率降至50%以下的信号定义为被衰减掉了(但要跟实际情况相结合,有些信号衰减-3db不够,需要衰减更多)-3dB这个点对应我们的电压来说是0.707。设计电路可以留一定的余量,如果你把4k设计为截止频率,那么4k时候衰减倍数为-3dB通常是不够的,你可以将截止频率设为2k,那么4k的衰减就可以达到15dB(假设),根据自己的需要去设计对应的截止频率。理想的滤波器是当输入的信号频率大于截止频率时,大于部分的频率对应的电压信号直接归0。

yybyybds的博客 5720

java设计模式---状态模式(State pattern)

java设计模式—状态模式(State pattern) 1. 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状...

渔潭的博客 477

Android malloc_debug实现原理及使用

2)设置 __libc_globals 对象中的 libc_globals.default_dispatch_table 和 current_dispatch_table 指向 malloc_dispatch_table,以后在 malloc 库函数里都会通过 GetDispatchTable(),这个函数就是返回的 current_dispatch_table 指针;MAX_FRAMES 表示被抓取的 frames 的数量,如果设为0, 表示在分配空间被释放时,不会抓取任何调用栈。

专注于系统快稳省领域 3742

uni-app - 解决 H5 微信公众号授权登录后,无法回退到 “上一页“ 的问题(微信登录后如何返回到触发它的那一页?无法通过 uni.navigateBack() 返回到前一页的问题?)详细教程

uniappH5微信登录重定向后无法返回到原来进入前的页面了,uni-appH5微信浏览器中授权微信登录后,无法正常回退问题,uniappH5微信登录后怎么返回上一页,uniapp公众号登陆后使用uni.navigateBack()回不去上一页,uniapp微信登录成功后返回页面后一直自动刷新页面,uniapph5授权成功后如何返回上一页,uniappH5微信登录后怎么返回到触发它的那一页去,公众号h5在授权后如何跳转回到刚进入时的页面,微信公众号H5网页返回上一页疑问,解决微信H5静默授

🏆 前端领域优质创作者 7715

JAVA设计模式之 状态模式【State Pattern】

一、概述     当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化。状态模式是一种对象行为型模式。 二、适用场景     用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题。简单说就是处理对象的多种状态及其相互转换。

小吕丶Code阶区 3891

【MATLAB】STM32电机调速闭环控制工程

本文提出了一种基于MATLAB仿真与STM32实现的直流电机闭环PID调速控制方案。通过MATLAB建立电机数学模型并进行参数整定,仿真验证了增量式PID算法在启停、稳态和抗扰动方面的优越性能。基于STM32F103搭建了硬件系统,实现了编码器测速、定时中断控制、PWM输出等功能。实测表明,该系统转速超调<2%、稳态误差±2r/min,具备快速响应和强抗扰能力。相比开环控制,闭环调速显著提升了动态性能和稳态精度。方案提供了完整的仿真代码和嵌入式工程源码,可直接应用于智能小车、工业传动等场景,具有较高的

unber的博客 50

Java设计模式——状态模式(STATE PATTERN)

Java设计模式——状态模式(STATE PATTERN) 转载:http://blog.youkuaiyun.com/u012401711/article/details/52675873

hackxiaoF的专栏 412

别白忙活!EAAI投稿避坑指南:5条红线碰就拒,工程应用重点划重点

EAAI投稿避坑指南:5条红线与工程应用要点 投稿《Engineering Applications of Artificial Intelligence》(EAAI)需特别注意5条红线,否则直接拒稿:1)避免提出新隐喻元启发式算法,应聚焦具体工程应用;2)摘要须明确区分AI贡献与工程应用;3)标题和摘要禁止使用未定义缩写;4)必须采用单栏格式;5)关键词不能包含缩写。此外,论文需突出AI方法在工程实践中的创新与落地价值,建议补充实际工程数据、部署成本分析和与传统方法的对比。投稿前务必逐项核查这5条要求,以

ZhangJiqun&191cm&85kg 3206

CSP - 2024 普及组初赛试题及解析

CSP - 2024 普及组初赛试题及解析

QD_Jason的博客 2910

java状态模式详解_详解JAVA 设计模式之状态模式

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

weixin_33508642的博客 292

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 状态模式(State Pattern) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 状态模式(State Pattern) 核心思想:对象的状态改变时,同时改变其行为。

Z 480

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java设计模式——状态模式【State Pattern】

Java设计模式、状态模式、State Pattern

scorpio的博客 520

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java设计模式 十八 状态模式 (State Pattern)

状态模式通过将每个状态的行为封装在独立的状态对象中,使得对象的行为随状态变化而变化。这种模式可以有效地管理和扩展具有多个状态的对象,特别是在复杂的状态转移和行为执行场景中,它提供了一种灵活且清晰的解决方案。

空 1135

Java 设计模式-状态模式

状态模式是一种,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定的状态相关的行为放到一个类中,并且将请求委托给当前状态对象来执行。在状态模式中,我们创建表示各种状态的对象和一个行为随状态对象改变而改变的Context对象。

精神小牛马 2129

Java设计模式之《状态模式》

状态模式是一种行为型设计模式,允许对象在内部状态改变时改变其行为。它通过将状态封装为独立类来解决if-else判断的弊端,实现开闭原则。文章对比了传统if-else实现与状态模式实现,展示了状态模式在订单系统等场景的优势:解耦状态和行为、可扩展性强、避免条件语句膨胀。同时提供了优化方案,如使用集合管理状态流转,使业务流程可配置化。状态模式适用于状态多且变化频繁的系统,但也可能增加系统复杂度。总体而言,该模式能有效管理复杂状态转换逻辑。

weixin_50055999的博客 1357

Java设计模式之状态模式详解

本文详细介绍了Java设计模式中的状态模式,该模式允许对象在内部状态变化时改变行为,避免了大量条件判断语句。文章通过Mermaid类图展示了状态模式的结构,包含Context、State接口和具体状态类之间的关系。并以自动售货机为例,提供了完整的Java代码实现,包括四种状态(无硬币、有硬币、售出商品、无商品)的具体处理逻辑和状态切换机制。状态模式使代码更清晰易维护,特别适用于对象行为依赖于状态的场景。

季鸢的博客 2493

java state behavior_java 设计模式之State(状态模式)

java 设计模式之state(状态模式)在状态模式中,一个类的行为基于它的状态的改变而改变。状态模式归属于行为型模式。在下面的实例中,我们创建了一个接口state,定义了一个操作方法,两个实现类startstate和stopstate。另外,创建了一个上下文类context,这个类关联到state类。uml类图如下所示://状态类public interface state {public vo...

weixin_36087586的博客 137

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

介绍 状态模式是一种行为型设计模式。当对象在不同状态下有不同行为时使用,在该模式中,我们将对象的不同状态 定义成不同的类,在这些状态类下有它们各自的行为,然后利用环境类使客户端在调用时,不需要显示地去设置状态之间的转换。下面先来看一下它的定义: Allow an object to alter its behavior when its internal state changes...

落队的飞行兵 1254

Java设计模式中状态模式介绍/状态模式怎么使用

Java设计模式中状态模式介绍/状态模式怎么使用

花花的小脑瓜的博客 753
上一篇: SpringBoot项目使用Liquibase 数据库版本管理
下一篇: Mybatis-Plus-Join 表连接插件集成
刘火锅
博客等级 码龄7年 121粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值