状态设计模式(State Pattern)[论点:概念、相关角色、图示、示例代码、框架中的运用、适用场景]

news/2024/11/26 7:15:00/

文章目录

  • 概念
  • 组成角色
  • 相关图示
  • 代码示例
  • 框架中的应用
  • 适用场景

概念

        状态模式(State Pattern)是一种行为型设计模式,用于解决对象在不同状态下的行为问题。它允许一个对象在其内部状态改变时改变它的行为。状态模式主要包含三个部分:上下文(Context)、状态接口(State)和具体状态实现类(ConcreteState)。

组成角色

  1. 状态接口(State):定义一个接口,用于封装与上下文类的一个特定状态相关的行为。
  2. 具体状态实现类(ConcreteState):实现状态接口,定义与该状态相关的行为。
  3. 上下文(Context):维护一个 State 类型的对象实例,该实例定义当前的状态。

相关图示

图片来自:https://refactoringguru.cn/design-patterns/state
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRtTYCD1-1681376543697)(/Users/dasouche/Library/Application Support/typora-user-images/image-20230413112815810.png)]

代码示例

//状态接口
interface State {void handle(Context context);
}//具体状态实现类ConcreteStateA、ConcreteStateB
class ConcreteStateA implements State {@Overridepublic void handle(Context context) {System.out.println("当前状态是 A.");//设置下一个执行状态节点context.setState(new ConcreteStateB());}
}class ConcreteStateB implements State {@Overridepublic void handle(Context context) {System.out.println("当前状态是 B.");//设置下一个执行状态节点context.setState(new ConcreteStateA());}
}//上下文对象
class Context {//当前执行节点private State state;public Context(State state) {this.state = state;}public void setState(State state) {this.state = state;}public State getState() {return state;}//执行节点逻辑public void request() {state.handle(this);}
}public class StatePatternDemo {public static void main(String[] args) {State initialState = new ConcreteStateA();Context context = new Context(initialState);//状态节点流转 A -> B -> A			context.request(); // 输出:当前状态是 A.context.request(); // 输出:当前状态是 B.context.request(); // 输出:当前状态是 A.}
}

框架中的应用

        一个常见的使用状态设计模式的例子是Java线程的状态管理。Java的Thread类使用了状态模式来表示线程的不同状态,例如:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。这些状态之间的转换由Thread类和相关的方法控制。

Thread.State枚举,它定义了Java线程的各种状态:

public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
}

线程状态之间的转换:

  1. NEW:当线程刚创建时,它处于NEW状态。在这个状态下,线程还没有开始执行。
  2. RUNNABLE:当调用线程的start()方法后,线程进入RUNNABLE状态。此时,线程已经开始执行或者准备执行,等待操作系统分配资源。
  3. BLOCKED:当线程试图获取一个已被其他线程锁定的对象的监视器(即进入synchronized块)时,线程进入BLOCKED状态。一旦锁被释放,线程将重新进入RUNNABLE状态。
  4. WAITING:当线程调用wait()、join()或LockSupport.park()方法时,线程进入WAITING状态。这表示线程正在等待另一个线程的通知或中断。当线程收到通知或中断时,它将重新进入RUNNABLE状态。
  5. TIMED_WAITING:当线程调用wait(long timeout)、sleep(long millis)、join(long millis)或LockSupport.parkNanos()等方法时,线程进入TIMED_WAITING状态。这表示线程正在等待另一个线程的通知、中断或超时。当线程收到通知、中断或超时时,它将重新进入RUNNABLE状态。
  6. TERMINATED:当线程执行完成或被中断时,它进入TERMINATED状态。在这个状态下,线程已经结束,不能再次启动。

状态切换图

在这里插入图片描述

适用场景

  1. 对象的行为随其状态改变而改变:当一个对象的行为因其内部状态而改变时,可以考虑使用状态模式。状态模式将对象的状态和行为分离,使得状态和行为可以独立地变化,提高了代码的灵活性和可维护性。
  2. 避免大量条件语句:状态模式可以减少因状态判断而导致的大量条件语句。通过使用状态模式,可以将状态相关的行为分散到各个状态类中,降低了代码的复杂性。
  3. 状态转换清晰:当一个对象的状态转换逻辑复杂且需要明确表示时,状态模式可以使状态转换更加清晰。状态模式将状态转换逻辑封装在状态类中,有助于理解和维护状态转换逻辑。

以下是一些使用状态设计模式的实际场景:

  1. 线程状态管理:Java线程状态管理是状态设计模式的一个典型应用。线程的状态(如新建、运行、阻塞等)由Thread.State枚举表示,状态之间的转换由Thread类及其相关方法控制。
  2. 工作流引擎:工作流引擎通常需要处理多个状态和状态之间的转换。状态模式可以帮助设计一个灵活的工作流引擎,使得状态和行为可以独立地变化。
  3. 游戏角色状态:在游戏开发中,角色可能有多种状态(如站立、行走、攻击等),并且状态之间可以相互转换。使用状态模式可以使游戏角色的状态管理更加清晰。
  4. 订单状态管理:在电商系统中,订单可能有多个状态(如待付款、待发货、已发货等),并且状态之间有一定的转换逻辑。状态模式可以帮助设计一个易于维护的订单状态管理系统。

http://www.ppmy.cn/news/49075.html

相关文章

Material Design:为你的 Android 应用提供精美的 UI 体验

Material Design:为你的 Android 应用提供精美的 UI 体验 介绍 Material Design 概念:介绍 Material Design 是 Google 推出的一种设计语言,用于创建现代、美观、直观且一致的用户界面。解释 Material Design 的基本原则,包括材料…

《商用密码应用与安全性评估》第一章密码基础知识1.6密钥交换协议

密码协议是指两个或者两个以上参与者使用密码算法时,为了达到加密保护或安全认证目的而约定的交互规则。 密钥交换协议 公钥密码出现之前,密钥交换很不方便,公钥密码可以在不安全信道上进行交换,交换的密码协议是为了协商会话密钥…

springboot+vue人职匹配推荐系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的人职匹配推荐系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 目前有各类成品java毕设,需要请看文…

【xxl-job定时任务框架详解】

一,分布式任务调度 基本概念 分布式任务调度是一种用于在分布式环境中调度和执行任务的技术。在分布式系统中,由于存在多台服务器、多个进程和线程并行执行,因此需要一种机制来协调和管理任务的执行,避免任务冲突、重复执行、负载不均衡等问题。分布式任务调度通常由一个…

NewBing、Andi、Phind、Perplexity 还有国产kuaisou五个AI搜索引擎的介绍和对比

NewBing NewBing是微软推出的新一代AI搜索引擎,它基于OpenAI的下一代大语言模型,比ChatGPT更强大,专门为搜索定制。NewBing可以理解自然语言的问题,生成简洁、准确、有趣的回答,并提供相关的链接和图片。NewBing还可以…

imgaug Augment Polygons 对标注图片和polygons的数据增强

对于本地化进行图像的增强,大家都是非常好操作的。但是,对于标注信息一起增强,还是稍微有一些难度的,麻烦很多。 我是遇到一个数据集非常少的任务,只有40张图。就直接标记了去训练,发现几乎不拟合&#xf…

Vivado布线和生成bit参数设置

本文主要介绍Vivado布线参数设置,基本设置方式和vivado综合参数设置基本一致,将详细说明如何设置布线参数以优化FPGA设计的性能,以及如何设置Vivado压缩BIT文件。 一、Vivado布线概述 Vivado布线是在FPGA设计中实现物理布局的关键步骤之一。…

2023年全国最新道路运输从业人员精选真题及答案58

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 69.根据《公路水路行业安全生产风险管理暂行办法》,…