状态模式 (State Pattern)

server/2024/12/2 8:33:50/

文章目录

      • 状态模式 (State Pattern)
      • 原理
      • 优点
      • 缺点
      • 示例代码
        • 场景描述
        • 1. 定义状态接口
        • 2. 定义具体状态类
        • 3. 定义上下文类
        • 4. 客户端代码
        • 输出结果
      • UML 类图
      • 使用场景
      • 扩展与优化
      • 小结

状态模式 (State Pattern)

状态模式是一种 行为型设计模式,允许对象在其内部状态改变时改变其行为,使得对象看起来像是改变了其类。


原理

  1. 核心思想
    • 将与对象状态相关的行为抽象到独立的状态类中。
    • 通过在不同状态下切换状态类,改变对象的行为。
  2. 适用场景
    • 对象的行为随状态的改变而改变。
    • 状态的条件逻辑复杂,使用模式可以避免复杂的 if-elseswitch-case
  3. 参与角色
    • Context(上下文类)
      • 管理状态,并向客户端提供统一的接口。
      • 内部维护一个当前状态实例。
    • State(状态接口)
      • 定义具体状态的行为接口。
    • ConcreteState(具体状态类)
      • 实现状态接口,定义特定状态的行为。

优点

  1. 消除条件逻辑
    • 通过多态分离状态行为,避免复杂的条件判断语句。
  2. 增加扩展性
    • 增加新状态无需修改已有代码,符合 开闭原则
  3. 状态自包含
    • 每个状态独立,易于管理。

缺点

  1. 增加类数量
    • 每种状态都需要一个类,导致类的数量增加。
  2. 状态切换复杂性
    • 如果状态间切换规则复杂,可能使上下文类难以管理。

示例代码

场景描述

模拟一个订单系统,订单可以处于不同状态(新建、支付、发货、完成)。不同状态下的行为有所不同。


1. 定义状态接口
// 状态接口
public interface OrderState {void handle(OrderContext context);
}

2. 定义具体状态类
// 新建状态
public class NewState implements OrderState {@Overridepublic void handle(OrderContext context) {System.out.println("Order is in 'New' state.");context.setState(new PaidState());}
}// 支付状态
public class PaidState implements OrderState {@Overridepublic void handle(OrderContext context) {System.out.println("Order is in 'Paid' state.");context.setState(new ShippedState());}
}// 发货状态
public class ShippedState implements OrderState {@Overridepublic void handle(OrderContext context) {System.out.println("Order is in 'Shipped' state.");context.setState(new CompletedState());}
}// 完成状态
public class CompletedState implements OrderState {@Overridepublic void handle(OrderContext context) {System.out.println("Order is in 'Completed' state.");// 最终状态,无法再改变}
}

3. 定义上下文类
// 上下文类
public class OrderContext {private OrderState state;public OrderContext() {// 初始状态为新建this.state = new NewState();}public void setState(OrderState state) {this.state = state;}public void processOrder() {state.handle(this);}
}

4. 客户端代码
public class StatePatternExample {public static void main(String[] args) {OrderContext order = new OrderContext();// 流程处理order.processOrder(); // 新建 -> 支付order.processOrder(); // 支付 -> 发货order.processOrder(); // 发货 -> 完成order.processOrder(); // 完成状态,无进一步操作}
}

输出结果
Order is in 'New' state.
Order is in 'Paid' state.
Order is in 'Shipped' state.
Order is in 'Completed' state.

UML 类图

        +-----------------+|    OrderState   |+-----------------+| + handle(Context)|+-----------------+^|+------+-------+--------------------+-------------------+|              |                    |                   |+-------------+ +-------------+    +-------------+     +-------------+|  NewState   | |  PaidState  |    | ShippedState|     |CompletedState|+-------------+ +-------------+    +-------------+     +-------------+| + handle()  | | + handle()  |    | + handle()  |     | + handle()  |+-------------+ +-------------+    +-------------+     +-------------+^|+----------------------+|     OrderContext     |+----------------------+| - state : OrderState || + setState(state)    || + processOrder()     |+----------------------+

使用场景

  1. 状态转换系统
    • 订单、流程审批等具有状态转换逻辑的系统。
  2. 游戏开发
    • 玩家角色的状态切换(如站立、行走、跳跃等)。
  3. 工作流引擎
    • 工单的状态流转(如创建、处理中、已完成)。

扩展与优化

  1. 状态复用
    • 如果某些状态是无状态的,可以用单例模式实现。
  2. 状态机框架
    • 对于复杂状态切换,可以使用现成的状态机框架(如 Spring Statemachine)。
  3. 状态数据分离
    • 将状态行为与具体状态数据分离,适用于复杂业务逻辑。

小结

  • 状态模式将状态与行为解耦,避免了复杂的条件逻辑。
  • 适用于对象行为随状态变化的场景。
  • 实现上要平衡状态类数量与复杂性的关系,防止类爆炸。

http://www.ppmy.cn/server/146657.html

相关文章

CSS学习记录01

什么是CSS? CSS指的是层叠样式表(Cascading Style Sheets), CSS描述了如何在屏幕、纸张或其他媒体上显示HTML元素, CSS可以同时控制多张网页的布局,因此节省了大量的工作。 外部样式表存储在CSS文件中。 *:也称为级联…

一条select语句的执行流程

select的工作原理 套接字(socket): 是一个编程接口,允许位于不同主机(甚至同一主机上的不同进程)之间的进程进行双向通信 套接字可以用来发送和接收数据,实现不同计算机或进程之间的网络通信 在网络分层模型中&…

1.2 算法和算法评价

1.2.1 算法的基本概念 算法:对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。 算法的五个重要特性 “好”的算法的五个目标 1.2.2 算法效率的度量 一、时间复杂度 算法的时间复杂度是指一个算法每行…

MySQL、Oracle、SQL Server 和 PostgreSQL 的分页查询

在不同的数据库中,分页查询是常见的操作,用于从大量数据中获取部分数据集。不同的数据库有不同的分页实现方式。下面是 MySQL、Oracle、SQL Server 和 PostgreSQL 的分页查询语法介绍。 1. MySQL 分页 在 MySQL 中,可以使用 LIMIT 和 OFFSE…

开源 - Ideal库 - Excel帮助类,设计思路(一)

今天开始和大家分享关于Excel最长常用操作封装。 01、起因 市面上有很多Excel操作库,这些库设计之初的目标是提供对Excel的各种操作功能,包括数据、样式、公式、图表等等。而对于我们平时开发来说,大多时候并不需要那么多强大的功能&#xf…

java 接口防抖

防抖:防止重复提交 在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。要针对用户的误操作,前端通常会实现按钮的l…

【西瓜书】支持向量机(SVM)

支持向量机(Support Vector Machine,简称SVM)。 超平面 分类学习最基本的想法就是基于训练集合D在样本空间中找到一个划分超平面,将不同类别的样本分开。 但能将训练样本分开的划分超平面可能有很多,应该努力去找到哪…

当新能源遇见低空经济:无人机在光伏领域的创新应用

随着全球能源结构的转型和技术的不断进步,新能源行业已成为推动经济社会发展的重要力量。其中,低空经济作为新兴的战略性产业,正深刻改变着人类社会的出行方式和产业链格局。在这一背景下,无人机与光伏产业的结合,不仅…