当前位置: 首页 > web >正文

设计模式-状态模式 Java

模式概述

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

简单代码示例

// 抽象状态
interface FanState {void turnUp(FanContext context);void turnDown(FanContext context);void printState();
}// 具体状态:关闭
class OffState implements FanState {@Overridepublic void turnUp(FanContext context) {context.setState(new LowState());System.out.println("风扇从【关闭】转为【低档】");}@Overridepublic void turnDown(FanContext context) {System.out.println("风扇已经关闭,无法再调低");}@Overridepublic void printState() {System.out.println("当前状态:关闭");}
}// 具体状态:低档
class LowState implements FanState {@Overridepublic void turnUp(FanContext context) {context.setState(new HighState());System.out.println("风扇从【低档】转为【高档】");}@Overridepublic void turnDown(FanContext context) {context.setState(new OffState());System.out.println("风扇从【低档】转为【关闭】");}@Overridepublic void printState() {System.out.println("当前状态:低档");}
}// 具体状态:高档
class HighState implements FanState {@Overridepublic void turnUp(FanContext context) {System.out.println("风扇已经是最高档,无法再调高");}@Overridepublic void turnDown(FanContext context) {context.setState(new LowState());System.out.println("风扇从【高档】转为【低档】");}@Overridepublic 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应用中

http://www.xdnf.cn/news/19674.html

相关文章:

  • 盲盒小程序系统开发:构建盲盒社交新生态
  • api验签
  • Unity 串口通讯2 硬件SDK 开发[数据监听,按键监听]
  • 前端静态资源缓存与部署实践总结
  • 纯代码实现登录页面的DIY
  • 从零开始的python学习——函数(1)
  • uni-app支持单多选、搜索、查询、限制能否点击组件
  • SpringBoot @RefreshScope 注解的极致玩法
  • 从零开始的云计算生活——第五十五天,黑云压城,kubernetes模块之网络组件和CoreDNS组件
  • 一次诡异的报错排查:为什么时间戳变成了 ١٧٥٦٦٣٢٧٨
  • 云端虚拟手机:云手机的原理是什么?
  • SRE 系列(五)| MTTK/MTTF/MTTV:故障应急机制的三板斧
  • 低空经济的中国式进化:无人机与实时视频链路的未来五年
  • 后端笔试题-多线程JUC相关
  • 用滑动窗口与线性回归将音频信号转换为“Token”序列:一种简单的音频特征编码方法
  • 全栈智算系列直播回顾 | 智算中心对网络的需求与应对策略(下)
  • Linux开发必备:yum/vim/gcc/make全攻略
  • 大模型微调显存内存节约方法
  • 【ComfyUI】图像描述词润色总结
  • 基于若依框架前端学习VUE和TS的核心内容
  • 函数、数组与 grep + 正则表达式的 Linux Shell 编程进阶指南
  • windows10专业版系统安装本地化mysql服务端
  • AI公共数据分析完整实战教程:从原始数据到商业洞察【网络研讨会完整回放】
  • golang -- viper
  • Go语言运维实用入门:高效构建运维工具
  • 洽洽的“成本龙卷风”与渠道断层
  • MVC问题记录
  • Python备份实战专栏第5/6篇:Docker + Nginx 生产环境一键部署方案
  • 【机器学习入门】4.4 聚类的应用——从西瓜分类到防控,看无监督学习如何落地
  • Mac上如何安装mysql