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

网站推荐你了解我意思吧文件乱码了怎么恢复

网站推荐你了解我意思吧,文件乱码了怎么恢复,电子网站建设价格,国家商标注册官网入口目录一、初阶:红绿灯的哲学课二、状态模式的四种修炼境界2.1 经典流派——面向对象式2.2 枚举派——消灭类爆炸2.3 Spring流——依赖注入的艺术2.4 现代派——记录类Lambda三、实战:电商订单的七十二变四、高阶技巧:状态机的N种打开方式4.1 状…

目录

    • 一、初阶:红绿灯的哲学课
    • 二、状态模式的四种修炼境界
      • 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/497363.html

相关文章:

  • 成都制作网站的公司简介做招聘网站需要做什么公司
  • asp.net 建立网站职校网站模板
  • 如何做网站服务外贸网站logo
  • 公司网站有时登不进 服务器南京seo报价
  • 微网站开发提供的服务最好网站设计案例
  • Stata计量经济学因果推断的本质是什么?如何有效掌握Stata操作,写出一篇合格的实证研究论文?
  • 江苏纬信网站建设上传网站怎么安装
  • 郑州市做网站公司常见的网站攻击方式
  • 遵义做网站建设哪家公司好箱包设计网站
  • 大山子网站建设可画官网登录入口
  • 建设公司网站价格魔站网站开发
  • 修水县城乡建设局网站微商城 分销平台
  • 如何用ppt形式做网站简单网页制作模板
  • 微网站绑定域名如何创建博客网站
  • wordpress mip站wordpress文章不在首页显示
  • 中小型企业网站设计与开发iis为网站子目录绑定二级域名
  • 做网站的系统功能需求网站建设评语
  • arraylist练习
  • 阿盟住房和城乡建设局门户网站不用框架做网站
  • 宿州哪有做网站的网址大全查询网站
  • 做网站通栏模糊商丘网站建设大全
  • 好动词做的网站能行吗网站产品页如何做优化
  • 旅游网站怎么做的司法局网站建设
  • 重庆网站制作的网站杭州网站建设公司费用
  • 做网站爱网站设计营销
  • 网站建设找什么公司好为什么要懂seo
  • 重庆做企业网站设计的公司网站备案时长
  • 南京 企业网站建设在哪里找工厂采购信息
  • 制作网站账号系统电子商务网站建设与维护代码
  • 洞口网站开发公司推荐wordpress 获取当前域名