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

20.万物皆可变身术:状态模式架构全景解析

目录

    • 一、初阶:红绿灯的哲学课
    • 二、状态模式的四种修炼境界
      • 2.1 经典流派——面向对象式
      • 2.2 枚举派——消灭类爆炸
      • 2.3 Spring流——依赖注入的艺术
      • 2.4 现代派——记录类+Lambda
    • 三、实战:电商订单的七十二变
    • 四、高阶技巧:状态机的N种打开方式
      • 4.1 状态+策略模式
      • 4.2 状态持久化
    • 五、最佳实践与防坑指南
    • 六、扩展思考:游戏开发中的状态魔法

“我的对象就像川剧演员——在不同状态下能瞬间切换不同行为,这可比只会if-else的呆瓜强多了!” —— 来自资深程序员的奇妙比喻

一、初阶:红绿灯的哲学课

假设我们要实现一个交通信号灯系统,新手可能会写出这样的代码:

public class TrafficLight {private String state = "RED";public void change() {if ("RED".equals(state)) {state = "GREEN";System.out.println("绿灯通行");} else if ("GREEN".equals(state)) {state = "YELLOW";System.out.println("黄灯减速");} else if ("YELLOW".equals(state)) {state = "RED";System.out.println("红灯停车");}}
}

痛点警报:当需要新增"闪烁黄灯"状态时,需要修改所有判断逻辑,这就像在已经建好的大楼里加装电梯——风险高、难度大!

二、状态模式的四种修炼境界

2.1 经典流派——面向对象式

// 状态接口
interface TrafficState {void handle(TrafficLight light);
}// 具体状态类
class RedState implements TrafficState {public void handle(TrafficLight light) {System.out.println("红灯停车");light.setState(new GreenState());}
}class GreenState implements TrafficState {public void handle(TrafficLight light) {System.out.println("绿灯通行");light.setState(new YellowState());}
}// 上下文类
class TrafficLight {private TrafficState state = new RedState();public void setState(TrafficState state) {this.state = state;}public void change() {state.handle(this);}
}// 使用示例
TrafficLight light = new TrafficLight();
light.change(); // 红灯 -> 绿灯
light.change(); // 绿灯 -> 黄灯

2.2 枚举派——消灭类爆炸

public enum ElevatorState {STOPPED {public void move(Elevator elevator) {System.out.println("电梯启动");elevator.setState(MOVING_UP);}},MOVING_UP {public void move(Elevator elevator) {System.out.println("到达顶层");elevator.setState(MOVING_DOWN);}},MOVING_DOWN {public void move(Elevator elevator) {System.out.println("到达底层");elevator.setState(STOPPED);}};public abstract void move(Elevator elevator);
}class Elevator {private ElevatorState state = ElevatorState.STOPPED;public void setState(ElevatorState state) {this.state = state;}public void call() {state.move(this);}
}

2.3 Spring流——依赖注入的艺术

public interface DocumentState {void review(Document document);
}@Component
class DraftState implements DocumentState {public void review(Document document) {if (validationPassed()) {document.setState(applicationContext.getBean(ReviewedState.class));}}
}@Service
class Document {@Autowiredprivate ApplicationContext applicationContext;private DocumentState state;public void review() {state.review(this);}
}

2.4 现代派——记录类+Lambda

public class MediaPlayer {record PlayState(Runnable onPlay) implements State {}record PauseState(Runnable onPause) implements State {}interface State {default void play(MediaPlayer player) {}default void pause(MediaPlayer player) {}}private State state = new PauseState(() -> System.out.println("播放暂停中"));public void play() {state.play(this);}void changeState(State newState) {this.state = newState;}
}

三、实战:电商订单的七十二变

public class Order {private OrderState state = new NewState();public void pay() {state.pay(this);}// 状态切换方法void setState(OrderState state) {this.state = state;}
}interface OrderState {default void pay(Order order) {throw new IllegalStateException("当前状态不支持支付");}// 其他操作方法...
}class NewState implements OrderState {public void pay(Order order) {System.out.println("支付成功");order.setState(new PaidState());}
}class PaidState implements OrderState {public void ship(Order order) {System.out.println("开始发货");order.setState(new ShippedState());}
}

四、高阶技巧:状态机的N种打开方式

4.1 状态+策略模式

public class GameCharacter {private State state = new NormalState();public void attack() {state.attack().execute();}
}interface State {Command attack();Command defend();
}class BerserkState implements State {public Command attack() {return () -> System.out.println("狂暴攻击!伤害+50%");}
}

4.2 状态持久化

public class Workflow {@Enumerated(EnumType.STRING)private StateType currentState;@Transient // 不持久化private State state;@PostLoadvoid initializeState() {this.state = StateFactory.getState(currentState);}
}enum StateType { DRAFT, APPROVAL, COMPLETED }

五、最佳实践与防坑指南

使用场景

  • 对象需要根据状态改变行为
  • 需要替代复杂的条件判断
  • 状态转换逻辑明确
  • 需要清晰的状态隔离

💥 避坑要点

  1. 避免上帝状态(单个状态类过于庞大)
  2. 注意线程安全问题(状态对象的可变性)
  3. 谨慎处理状态迁移的副作用
  4. 考虑状态对象的创建成本
倒计时结束
倒计时结束
倒计时结束
Red
Green
按钮按下
30秒后
Walk
Wait
Yellow

六、扩展思考:游戏开发中的状态魔法

实现一个超级马里奥的状态系统:

public class Mario {private MarioState state = new SmallState();public void takeMushroom() {state = state.takeMushroom();}public void takeFireFlower() {state = state.takeFireFlower();}
}interface MarioState {MarioState takeMushroom();MarioState takeFireFlower();default void attack() {System.out.println("跳跃攻击");}
}class FireMario implements MarioState {public MarioState takeMushroom() {return this; // 形态不变}public void attack() {System.out.println("发射火球!");}
}

终极挑战:如果我们要实现一个智能咖啡机的状态系统(待机、磨豆、冲泡、清洁、故障状态),你会如何设计状态之间的转换关系?欢迎在评论区留下你的设计方案!

http://www.dtcms.com/a/322551.html

相关文章:

  • 【Git】Visual Studio 实现合并分支
  • 在 Ubuntu 中测试串口通信:详细指南与实践
  • 【面试场景题】微博热点新闻系统设计方案
  • 容器docker场景下新增接口测试及工具使用方法介绍
  • 人工智能技术发展历史演变
  • Java基础-TCP通信(多发多收和一发一收)
  • 八、Linux Shell 脚本:变量与字符串
  • Dotenv 入门教程
  • 政府数字化大屏系统 - Flask实现方案
  • 上海AI Lab、浙大EagleLab等提出RRVF:利用「验证非对称性」,只输入图片学习视觉推理
  • 接口文档深入解析
  • OpenAI开源大模型 GPT-OSS 开放权重语言模型解析:技术特性、部署应用及产业影响
  • Python基础教程(七)匹配模式:隐藏在结构之美中的编程革命
  • JVM常用参数有哪些?
  • Orange的运维学习日记--36.NFS详解与服务部署
  • 人脸情绪检测数据集-9,400 张图片 智能客服系统 在线教育平台 心理健康监测 人机交互优化 市场研究与广告 安全监控系统
  • WinForm 复合控件(用户控件):创建与使用指南
  • 【2025】Datawhale AI夏令营-多模态RAG-Task1、Task2笔记-任务理解与Baseline代码解读
  • 线程池多反应堆服务器webserver(c++)
  • 免费PDF编辑软件 pdf24-creator 及其安装包
  • 【无标题】AI 赋能日常效率:实用案例与操作心得分享
  • AI工具在数据质量管理中的应用
  • 电子电气架构 --- 电气/电子架构迁移已拉开帷幕
  • CamX-骁龙相机修改
  • Docker Desktop 使用操作指南
  • 费米问题:估算北京有多少量特斯拉汽车?
  • 虚拟机Ubuntu重启发现找不到共享文件夹
  • 202506 电子学会青少年等级考试机器人一级理论综合真题
  • 「iOS」————响应者链与事件传递链
  • 【工具变量】全国省级农业保险保费收入与赔付支出数据更新(2001-2023年)