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

设计模式-状态模式 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.dtcms.com/a/362193.html

相关文章:

  • 华清远见25072班I/O学习day2
  • PostgreSQL备份指南:逻辑与物理备份详解
  • 椭圆曲线群运算与困难问题
  • 【数据分享】多份土地利用矢量shp数据分享-澳门
  • AI产品经理面试宝典第81天:RAG系统架构演进与面试核心要点解析
  • Qt中的信号与槽机制的主要优点
  • 自动化测试时,chrome浏览器启动后闪退的问题
  • 【趣味阅读】Python 文件头的秘密:从编码声明到 Shebang
  • VisionProC#联合编程相机实战开发
  • 【云存储桶安全】怎么满足业务需求,又最大程度上满足信息安全要求呢?
  • 1792. 最大平均通过率
  • 学习:uniapp全栈微信小程序vue3后台-暂时停更
  • 本地没有公网ip?用cloudflare部署内网穿透服务器,随时随地用自定义域名访问自己应用端口资源
  • 液态神经网络:智能制造的新引擎
  • 【跨境电商】上中下游解释,以宠物行业为例
  • 洛谷 c++ P1177 【模板】排序 题解
  • AutoSar RTE介绍
  • 特征增强方法【特征构建】
  • MVC、三层架构
  • RT-DETR网络结构
  • 并发之线程
  • 【思考】WSL是什么
  • 一、SVN与svnbucket.com常见问题解答
  • 从组分到涌现:系统科学视域下结构、功能与层级的辨析及在人工智能中的应用
  • 设备管理软件正在成为制造业企业的战略重点_HawkEye智能运维平台_璞华大数据
  • 对比Mysql理解OceanBase中的租户设计
  • PostgreSQL 从入门到精通:一场与开源数据库的深度对话
  • 时序数据库国产的有哪些?
  • 利用棒棒糖图探索Office (US)的IMDB评分
  • 毕业项目推荐:64-基于yolov8/yolov5/yolo11的蝴蝶种类检测识别系统(Python+卷积神经网络)