李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 后端
  3. 正文

Java设计模式:状态模式

2025年5月22日 256 0 0
合集:Java设计模式第 1 篇 / 共 8 篇
Java›Java设计模式
  1. 1Java设计模式:状态模式当前
  2. 2Java设计模式:策略模式
  3. 3Java设计模式:模板方法模式
  4. 4JAVA设计模式-抽象工厂模式
  5. 5JAVA设计模式-工厂方法模式
  6. 6Java设计模式-原型模式
  7. 7Java设计模式-单例模式
  8. 8设计模式总结

状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来像是对象修改了它的类。其核心思想是将状态相关的行为封装到独立的状态类中,并让对象在不同状态间切换时委托行为给当前状态对象。

核心概念

  • 状态接口(State Interface):定义特定状态下的行为方法。
  • 具体状态(Concrete States):实现状态接口,封装特定状态的行为。
  • 上下文(Context):持有当前状态对象的引用,并负责状态切换。

应用场景

  • 当对象行为依赖于其状态,且状态在运行时动态变化。
  • 避免使用大量条件语句(如if-else或switch)来处理不同状态。
  • 状态转换逻辑复杂,需要集中管理。

代码示例

以下是一个简单的订单状态机示例,演示状态模式的实现:

// 状态接口
public interface OrderState {
    void processOrder(OrderContext order);
    void cancelOrder(OrderContext order);
}

// 具体状态:待支付
public class PendingPaymentState implements OrderState {
    @Override
    public void processOrder(OrderContext order) {
        System.out.println("支付成功,订单处理中...");
        order.setState(new ProcessingState());
    }

    @Override
    public void cancelOrder(OrderContext order) {
        System.out.println("订单已取消,退款中...");
        order.setState(new CancelledState());
    }
}

// 具体状态:处理中
public class ProcessingState implements OrderState {
    @Override
    public void processOrder(OrderContext order) {
        System.out.println("订单正在处理中,请勿重复提交...");
    }

    @Override
    public void cancelOrder(OrderContext order) {
        System.out.println("订单已取消,正在准备退款...");
        order.setState(new CancelledState());
    }
}

// 具体状态:已取消
public class CancelledState implements OrderState {
    @Override
    public void processOrder(OrderContext order) {
        System.out.println("已取消的订单无法处理,请重新下单。");
    }

    @Override
    public void cancelOrder(OrderContext order) {
        System.out.println("订单已处于取消状态。");
    }
}

// 上下文:订单
public class OrderContext {
    private OrderState currentState;

    public OrderContext() {
        // 初始状态为待支付
        this.currentState = new PendingPaymentState();
    }

    public void setState(OrderState state) {
        this.currentState = state;
    }

    public void processOrder() {
        currentState.processOrder(this);
    }

    public void cancelOrder() {
        currentState.cancelOrder(this);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        OrderContext order = new OrderContext();

        // 处理订单(支付)
        order.processOrder(); // 输出:支付成功,订单处理中...

        // 尝试取消已处理的订单
        order.cancelOrder(); // 输出:订单已取消,正在准备退款...

        // 尝试处理已取消的订单
        order.processOrder(); // 输出:已取消的订单无法处理,请重新下单。
    }
}

状态模式的优势

  1. 单一职责原则:状态相关行为封装在独立类中,提高内聚性。
  2. 开闭原则:新增状态无需修改现有代码,只需扩展。
  3. 消除条件语句:替代复杂的条件判断,使状态转换更清晰。

状态模式 vs 策略模式

  • 状态模式:状态自动切换,状态间存在转换逻辑,客户端通常不直接操作状态。
  • 策略模式:客户端主动选择策略,策略间无依赖关系。

实际应用案例

  • 游戏开发:角色状态(站立、跑步、跳跃)的切换。
  • 工作流引擎:审批流程的状态流转(待提交、审核中、已通过)。
  • TCP连接:连接状态(ESTABLISHED、CLOSED、TIME_WAIT)的管理。

总结

状态模式通过将状态行为封装到独立类中,使对象行为能随状态动态变化,提高了代码的可维护性和可扩展性。使用时需注意状态类数量可能较多,可结合享元模式共享状态对象以减少内存开销。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

Java设计模式:状态模式

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: JAVA 状态模式 设计模式
最后更新:2026年7月14日

岁月同一天 11 月 7 日

回望过去的今天,你在写什么

  • AI
    1 年前 2025年11月7日
    DeepSeek本地部署全攻略:从环境搭建到高级应用,打造专属 AI 助手

    DeepSeek 作为国产开源大模型的佼佼者,凭借出色的推理能力、代码生成效率和中文支持,成为很多开发者本地部署的首选。…

相关文章
  • Java通用枚举还能这样做?前后端终于不扯皮了!2025年10月21日
  • @Valid 和 @Validated 的区别2025年5月23日
  • 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志2020年3月19日
  • 从"臃肿冗余"到"优雅简洁":那些让Java开发者顿悟的代码艺术与底层逻辑2025年10月28日
  • 数据库更新如何实现乐观锁2025年12月26日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
合集下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

他乡共酌金花酒,万里同悲鸿雁天。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
给服务器加了WAF 又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619)
给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了给服务器加了WAF游本昌去世关于主题加载速度优化的一点儿小演进
docker registry私库镜像删除 try...catch性能深度剖析:从JVM原理到实战优化,打破技术迷思 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志 Let's Encrypt宣布证书缩短至64天,手动时代彻底终结! 代码仓库挂了 办理居住证困难重重啊!
最近评论
fairy 发布于 21 小时前(11月06日) 机器人快来我这里吧!
李锋镝 发布于 21 小时前(11月06日) 都是机器人,防不住
李锋镝 发布于 21 小时前(11月06日) 是的,太烦了
李锋镝 发布于 21 小时前(11月06日) 可以同一台服务器
fairy 发布于 23 小时前(11月06日) 这流量,好厉害啊。我一年都没那么多
标签聚合
IDEA Theme AI编程 Claude 多线程 架构 WordPress 分布式 日常 MySQL Spring SQL SpringBoot AI ElasticSearch JVM Redis K8s 数据库 JAVA
友情链接
  • 韩小韩博客
  • 搬砖日记
  • 懋和道人
  • 志文工作室
  • sssr7844的博客
  • 彬红茶日记
  • 知向前端
  • Mr.Sun的博客
  • 刘永博客
  • 老张博客
  • 林羽凡
  • 九仞之行
  • 哥斯拉
  • 瓦匠个人小站
  • Serendipity
  • lijie blog
  • 韩情脉脉
  • Honesty
  • 皮皮社

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com 十年之约虫洞

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号