设计模式精讲 Day 20:状态模式(State Pattern)

【设计模式精讲 Day 20】状态模式(State Pattern)


文章标签

设计模式, 状态模式, Java开发, 面向对象设计, 软件架构, 设计模式实战, Java应用开发


文章简述

状态模式是行为型设计模式中的重要一员,用于管理对象在不同状态下的行为变化。在实际项目中,状态模式能够有效解耦状态逻辑,提升系统的可维护性和扩展性。本文作为“设计模式精讲”系列的第20天,深入讲解了状态模式的核心思想、实现方式和实际应用场景。文章通过完整的Java代码示例,展示了如何在具体业务场景中使用状态模式优化系统结构,并结合真实案例分析其优势与局限性。无论你是初学者还是有经验的开发者,这篇文章都将帮助你掌握状态模式的设计精髓并应用于实际项目中。


【设计模式精讲 Day 20】状态模式(State Pattern)

开篇:状态模式的核心思想与应用价值

今天是“设计模式精讲”系列的第20天,我们聚焦于状态模式(State Pattern)。状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为,使得对象的行为与其状态保持一致。

在软件开发中,很多业务场景需要根据不同的状态执行不同的操作,例如订单状态从“待支付”变为“已支付”,或者用户状态从“未登录”变为“已登录”。如果直接使用条件判断来处理这些状态转换,会导致代码臃肿、难以维护。而状态模式通过将状态封装为独立的对象,实现了状态与行为的解耦,使系统更加灵活、可扩展。

本篇文章将从模式定义、结构、适用场景、实现方式、工作原理、优缺点分析、案例分析等多个维度,全面解析状态模式,并提供完整可运行的Java代码示例,帮助你真正掌握这一设计模式。


模式定义

1.1 正式定义

状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。该模式将状态相关的行为封装到不同的状态类中,使得对象的行为随着状态的变化而变化,而无需显式的条件判断语句。

1.2 核心思想

  • 状态封装:每个状态由一个独立的类表示,封装对应的行为。
  • 状态切换:对象的状态可以通过调用方法进行切换,而不会影响其他部分。
  • 行为委托:对象的行为由当前状态对象负责,而非自身。

模式结构

2.1 UML 类图说明(文字描述)

状态模式包含以下几个关键角色:

角色说明
Context(上下文)维护当前状态对象,并将请求委托给当前状态对象处理。
State(状态接口)定义所有具体状态类需要实现的方法。
ConcreteStateA / B(具体状态类)实现 State 接口,定义在特定状态下应执行的行为。

2.2 示例结构说明

  • Context 类持有 State 接口的引用。
  • State 是抽象类或接口,定义了 handle() 方法。
  • ConcreteStateAConcreteStateB 分别实现 Statehandle() 方法,定义各自的行为。

适用场景

场景说明
对象行为依赖于其状态当对象的行为随状态变化时,适合使用状态模式。
多个条件分支导致代码复杂使用状态模式可以避免大量的 if-elseswitch-case 判断。
状态转换频繁在状态频繁切换的场景下,状态模式能提高代码可读性和可维护性。
需要扩展新状态新增状态只需添加新的状态类,无需修改现有代码。

实现方式

3.1 Java 代码实现

以下是一个基于状态模式的简单示例,模拟一个“订单状态机”的行为。

3.1.1 定义状态接口
// State.java
public interface State {void handle(OrderContext context);
}
3.1.2 具体状态类
// PendingState.java
public class PendingState implements State {@Overridepublic void handle(OrderContext context) {System.out.println("订单处于待支付状态");context.setState(new PaidState());}
}// PaidState.java
public class PaidState implements State {@Overridepublic void handle(OrderContext context) {System.out.println("订单已支付");context.setState(new ShippedState());}
}// ShippedState.java
public class ShippedState implements State {@Overridepublic void handle(OrderContext context) {System.out.println("订单已发货");context.setState(new DeliveredState());}
}// DeliveredState.java
public class DeliveredState implements State {@Overridepublic void handle(OrderContext context) {System.out.println("订单已签收");context.setState(new CompletedState());}
}// CompletedState.java
public class CompletedState implements State {@Overridepublic void handle(OrderContext context) {System.out.println("订单已完成");}
}
3.1.3 上下文类
// OrderContext.java
public class OrderContext {private State state;public OrderContext() {this.state = new PendingState(); // 初始状态为待支付}public void setState(State state) {this.state = state;}public void handle() {state.handle(this);}
}
3.1.4 测试类
// StatePatternTest.java
public class StatePatternTest {public static void main(String[] args) {OrderContext order = new OrderContext();order.handle(); // 待支付order.handle(); // 已支付order.handle(); // 已发货order.handle(); // 已签收order.handle(); // 已完成}
}

输出:

订单处于待支付状态
订单已支付
订单已发货
订单已签收
订单已完成

工作原理

状态模式通过将状态相关的逻辑封装到各个状态类中,使得上下文对象(如 OrderContext)不再需要知道具体的业务逻辑,而是将请求委托给当前状态对象处理。

当状态发生变化时,只需要修改上下文对象持有的状态引用即可,无需修改原有代码。这种机制符合开闭原则,提高了系统的可扩展性和可维护性。


优缺点分析

优点缺点
解耦状态逻辑:状态行为被封装,避免了大量条件判断。增加类的数量:每个状态都需要一个类,可能导致类爆炸。
易于扩展:新增状态只需添加新类,无需修改已有代码。状态切换复杂:状态之间的转换可能需要额外的逻辑处理。
符合单一职责原则:每个状态类只关注自己的行为。学习成本较高:对于新手来说,理解状态模式的结构有一定难度。

案例分析:订单状态管理

4.1 问题描述

某电商平台的订单系统中,订单状态包括:待支付、已支付、已发货、已签收、已完成。每次状态变更都需要触发相应的业务逻辑,比如发送通知、更新库存等。但目前的实现方式是通过大量 if-else 判断,导致代码冗长、难以维护。

4.2 解决方案

采用状态模式重构订单状态管理逻辑,将每个状态的行为封装为独立的类,通过上下文对象统一管理状态转换。

4.2.1 改进后的代码结构
  • OrderContext:管理订单状态
  • State 接口:定义状态处理方法
  • PendingStatePaidState 等:分别实现状态行为
4.2.2 优势体现
  • 可维护性提升:新增状态只需添加新类
  • 可读性增强:状态行为清晰明了
  • 可测试性强:每个状态类可单独测试

与其他模式的关系

模式关系说明
策略模式(Strategy Pattern)类似但用途不同策略模式用于替换算法,状态模式用于控制行为变化
命令模式(Command Pattern)可组合使用命令模式封装请求,状态模式控制行为,二者可协同工作
工厂模式(Factory Pattern)可配合使用工厂模式可用于创建状态对象,简化状态初始化过程

总结

5.1 本日学习要点

  • 状态模式的核心思想是将对象的状态行为封装为独立的类。
  • 通过上下文对象统一管理状态转换,实现行为与状态的解耦。
  • 状态模式适用于多状态、行为变化频繁的场景。
  • 通过完整 Java 示例,展示了状态模式的实现方式和实际应用。
  • 状态模式与策略模式、命令模式等存在相似之处,但在应用场景上有明显区别。

5.2 下一日预告

明天我们将进入“设计模式精讲”系列的第21天,主题为【设计模式精讲 Day 21】策略模式(Strategy Pattern)。我们将探讨如何通过策略模式实现算法的动态切换,提升系统的灵活性和可扩展性。敬请期待!


进一步学习资料

  1. 《设计模式:可复用面向对象软件的基础》 —— GoF 经典著作
  2. 状态模式 - Wikipedia
  3. Java 设计模式之状态模式详解
  4. Spring 框架中的状态模式应用
  5. 状态模式 vs 策略模式对比

【设计模式精讲 Day 20】状态模式(State Pattern) 已完成,欢迎转发、收藏、评论交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89442.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桥岛隧大型工程 3D 可视化监测平台

深中通道作为“桥、岛、隧、水下互通”一体化跨海集群工程,其复杂结构带来高强度监测难题。借助图扑软件 HT 实现深中通道的建设与运营的数字化升级,为交通基建行业迈向高效、智能的未来提供了有力支撑。 图扑自主研发的 HT for Web 产品搭建深中通道-桥…

基于SpringBoot和Leaflet的区域冲突可视化系统(2025企业级实战方案)

摘要 在全球地缘冲突与应急事件频发的2025年,区域态势可视化系统成为政府及企业的决策刚需。本文提出基于​​SpringBoot 3.2​​后端与​​Leaflet 1.9.5​​前端的冲突可视化解决方案,融合多源异构数据(卫星影像、舆情热力、设施状态&…

[密码学实战]国密TLCP协议报文解析代码实现(三十)

[密码学实战]国密TLCP协议报文解析代码实现(三十) 本文将深入解析国密TLCP协议报文结构,提供完整的Java实现代码,帮助开发者理解TLCP协议在国密环境下的通信机制和安全性设计。 一、国密TLCP协议概述 TLCP(Transport Layer Cryptographic Protocol)是基于国密算法(SM2/…

[Python] -基础篇5-玩转Python内置数据结构:列表、元组、字典与集合

Python 是一门以简洁优雅著称的编程语言,其中内置的数据结构为日常编程提供了强大支持。本文将系统介绍 Python 中四大核心数据结构:列表(list)、元组(tuple)、字典(dict)与集合(set),并配以实用示例,帮助读者全面掌握其用法及适用场景。 一、列表(List):可变序…

技术突破与落地应用:端到端 2.0 时代辅助驾驶TOP10 论文深度拆解系列【第八篇(排名不分先后)】

HiP-AD: Hierarchical and Multi-Granularity Planning with Deformable Attention for Autonomous Driving in a Single Decoder GitHub地址:​https://github.com/nullmax-vision/HiP-AD​ 在自动驾驶技术飞速发展的今天,端到端自动驾驶(E…

transformer位置编码研究相关的综述、论文

一、权威综述 《利用位置编码实现长度外推》 (腾讯云开发者社区, 2024) 系统分析绝对/相对位置编码(APE/RPE)在长序列外推中的技术演进,涵盖RoPE、Alibi、Xpos等优化方案,讨论位置插值、NTK-aware缩放等扩展…

垂直领域AI智能体开发指南:用Bright Data MCP接入智能体攻克数据难关

垂直领域AI智能体开发指南:用Bright Data MCP接入智能体攻克数据难关 一、智能体时代的数据困局1.1 AI智能体的爆发式增长1.2 开发者遭遇的"数据瓶颈" 二、Bright Data MCP:智能体的数据引擎2.1 重新定义数据获取方式2.2 支持的核心场景2.3 四…

Stable Diffusion 项目实战落地:从0到1 掌握ControlNet 第三篇: 打造光影字形的创意秘技-文字与自然共舞

上一篇,我们一起玩转了 野外光影字,是不是被那种自然和光影交织的效果惊艳到啦? 如果你错过了那篇文章,别担心,赶紧点这里补课:Stable Diffusion 项目实战落地:从0到1 掌握ControlNet:打造光影文字 第二篇 - 野外光影字。 今天,我们将一起做一个 生成的嵌入式文字【…

CppCon 2018 学习:Feather: A Modern C++ Web Development Framework

你这段内容罗列的是 Web 开发中的几个基础概念和组成模块,下面我逐一用中文进行解释,并理清它们之间的关系: 基础概念说明 1. HTTP Server(HTTP服务器) 是一个监听 HTTP 请求并返回响应的程序。主要功能&#xff1a…

武汉大学机器人学院启航:一场颠覆性的产教融合实验,如何重塑中国智造未来?

当百年学府按下“产业加速键”,教育革命的号角已经吹响 2025年7月,武汉大学一纸公告震动教育界与科技圈——成立机器人学院,携手小米、宇树等硬科技领军企业,聘请10位产业教授入驻。这绝非一次常规的校企合作,而是一场…

QT记事本4——下拉框修改值后解决乱码问题

下拉框修改值后解决乱码问题 void Widget::onCurrentIndexChanged(int index) {qDebug()<<index;//索引从0开始qDebug()<<ui->comboBox->currentText();//切换编码时&#xff0c;首先清空当前的文本框ui->textEdit->clear();if(file.isOpen()){//仅在…

““ ‘‘ C++

在C中&#xff0c;"" 和 的含义完全不同&#xff0c;只有""是空字符串&#xff0c;而既不是空字符串&#xff0c;也不能表示空字符&#xff0c;具体区别如下&#xff1a; 1. 双引号 ""&#xff1a;空字符串字面量 类型&#xff1a;const char…

电脑远程控制另一台电脑无法连接怎么办

电脑远程控制另一台电脑无法连接怎么办&#xff1f;远程桌面连接是远程管理另一台计算机时比较常用的方式&#xff0c;在进行电脑远程控制时&#xff0c;无法连接是常见的问题&#xff0c;以下将从多个方面分析原因并提供解决方法。如果涉及无公网IP目标主机需要远程桌面连接的…

springboot3.2/3.4+rocketmq5.3.3测试程序的基本例子

想测试下springboot新版中与rocketmq5.3.3的配置使用&#xff0c;今天尝试了下&#xff0c;记录如下&#xff1a; 1、首先springboot使用3.2.7&#xff0c;rocketmq使用5.3.3&#xff0c;且使用docker部署rocketmq。 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/do…

深入剖析AI大模型:TensorFlow

今天来聊一下TensorFlow&#xff0c;任何一门技术我建议还是从它出现的背景开始。因为你这就知道它存在的原因是什么。2015 年&#xff0c;Google 开源了深度学习框架 TensorFlow&#xff0c;一经推出便在学术界和工业界引起巨大反响。当时&#xff0c;深度学习模型的复杂度与日…

【数字后端】- tcbn28hpcplusbwp30p140,标准单元库命名含义

tcbn28: 代表工艺类型是台积电28nm工艺hpcplus: 代表工艺平台是HPC BWP: 其中B代表标准单元的类型是 “standard” base cell&#xff1b;W代表N-well 工艺&#xff0c;放置在 P-substrate上&#xff1b;P表示该 cell 使用的是 P-type transistor layout orientation&#xff1…

KNN算法详解及Scikit-learn API使用指南

一、KNN算法介绍 K最近邻(K-Nearest Neighbor, KNN)算法是机器学习中最简单、最直观的分类算法之一。它既可以用于分类问题&#xff0c;也可以用于回归问题。KNN是一种基于实例的学习(instance-based learning)或懒惰学习(lazy learning)算法&#xff0c;因为它不会从训练数据…

【PMP】项目管理入门:从基础到环境的体系化拆解

不少技术管理者都有过这样的困惑&#xff1a; 明明按流程做了项目管理&#xff0c;结果还是延期、超预算&#xff1f;需求变更多到炸&#xff0c;到底是客户无理还是自己没管好&#xff1f;跨部门协作像“推皮球”&#xff0c;资源总不到位&#xff1f; 其实&#xff0c;项目失…

【Web前端】简易轮播图显示(源代码+解析+知识点)

一、简易轮播图源代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>简易轮播图显示</title><style type"text/css">*{margin: 0 auto;padding: 0;/* 全局重置边距 */}p{text-align: center;fon…

电机试验平台的用途及实验范围

电机试验平台是一种专门设计用来对各种类型的电机进行测试和分析的设备。在现代工业中&#xff0c;电机作为驱动力的重要组成部分&#xff0c;在各个领域发挥着至关重要的作用。而为了确保电机的性能、效率和可靠性达到最佳水平&#xff0c;需要进行各种试验和测试。电机试验平…