文章目录

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

概念

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

组成角色

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

相关图示

图片来自:https://refactoringguru.cn/design-patterns/state

代码示例

//状态接口
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. 订单状态管理:在电商系统中,订单可能有多个状态(如待付款、待发货、已发货等),并且状态之间有一定的转换逻辑。状态模式可以帮助设计一个易于维护的订单状态管理系统。

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

  1. 生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]

    文章目录 概念 相关图示 代码示例 框架中的应用 场景 多个生成器(Concrete Builder): 单个生成器 概念 生成器设计模式(Builder Design Pattern)是一种创建型设 ...

  2. php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)

    状态模式 (State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for States) (一)为什么需要状态模式 ...

  3. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对"状态模式"并不陌生,因为我们之前使用到了状态模式进行 ...

  4. 极速理解设计模式系列:22.状态模式(State Pattern)

    四个角色:抽象状态类(State).具体状态类(ConcreateState).情景类(Context).客户端(Client) 抽象状态类(State):提供一个与情景类有关的State行为. 具体 ...

  5. 41状态模式(State Pattern)

    对象状态影响对象行为:     对象拥有不同的状态,往往会行使不同的行为...                     动机:     在软件构建过程中,某些对象的状态如果改变以及其行为也会随之而发生 ...

  6. 状态模式(State Pattern)

    状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类 考虑如下场景,自动售票机: 每一个方格表示自动售票机的一种状态,每一个箭头线表示自动售票机由一个状态转换到另一个状态所需要的 ...

  7. PHP设计模式 - 门面模式(Facade)通俗易懂 / 友好示例代码

    前言 门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面.门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户 ...

  8. 策略设计模式(Strategy Pattern)[论点:概念、组成角色、相关图示、示例代码、适用场景]

    文章目录 概念 组成角色 相关图示 示例代码 适用场景 概念 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换.策略模式 ...

  9. 中介者设计模式(Mediator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、适用场景]

    文章目录 概念 组成角色 相关图示 示例代码 适用场景 概念 中介者设计模式是一种行为型设计模式,它通过引入一个中介对象来封装一组对象之间的交互,使得对象之间不需要显式地相互引用,从而降低它们之间的耦 ...

最新文章

  1. linux下crontab实现定时服务详解
  2. 【⭐C++宝藏男孩⭐】C++ string字符串比较
  3. java getstringarray_Java AnnotationAttributes.getStringArray方法代碼示例
  4. 九、WebService中文件传输
  5. JavaWeb学习总结(三):Tomcat服务器学习和使用(二)
  6. c语言写的心理测试,写了个心理测试的c程序(*^__^*) 嘻嘻……
  7. 中山计算机辅助设计报考,中山模具设计与CNC数控编程专业
  8. 获取文件夹中所有文件的文件名[重复]
  9. java线程池示例_Java线程连接示例
  10. RequestContextHolder 获取 ServletRequest 和 ServletResponse,Spring MVC ModelAndView 数据响应 Response
  11. 比navicat还好用的mysql可视化工具
  12. 虚拟现实未来前景无限
  13. python如何安装pdfminer_Python 3.6 中使用pdfminer解析pdf文件的实现
  14. 黑客游戏-梦之光芒1~14攻略
  15. Redisson红锁
  16. 记一次给笔记本安装固态硬盘
  17. Python数据分析与处理(例题)
  18. 大名鼎鼎的 Linux —— 进程,线程,协程
  19. i-Shanghai无法跳转登陆页面/登陆页面打不开的解决方法
  20. 计算机flash听课记录范文,听课记录5篇

热门文章

  1. 触控科技Cocos2d-x游戏引擎的重量
  2. emc文件服务器浏览记录,EMC存储系统安全审核, EMC审计 - 报表展现
  3. 华为麦芒4配置fillder证书问题:
  4. SQL Server中使用convert进行日期转换
  5. 最优化学习 KKT条件(最优解的一阶必要条件)
  6. kkt条件的理解_直观理解KKT条件
  7. Win32多线程程序设计学习(第五章)
  8. 如何建立零售行业的数据分析模型
  9. React Native之react-navigation动态修改标题、页面导航等
  10. ROS控制多台机器人实现多机协同