当前位置: 首页 > article >正文

设计模式(行为型)-状态模式

目录

定义

类图

角色

state:抽象状态对象​

ConcreteState:具体状态角色​

Context: 环境角色​

优缺点

优点​

缺点​

使用场景

代码示例

总结


定义

        状态模式允许一个对象在其内部状态改变时改变它的行为,从外部看来,对象仿佛修改了它的类。它是行为型设计模式的杰出代表,通过将对象的状态封装在不同的状态类中,使得对象的行为能够根据当前状态动态调整。例如,在一个游戏角色系统中,角色可能处于正常、奔跑、跳跃、受伤等多种状态。当角色从正常状态切换到奔跑状态时,其移动速度、动画表现等行为都会随之改变,这正是状态模式的生动体现。

        状态模式与策略模式堪称 “亲兄弟”,但二者存在关键区别:策略模式着重于让对象在运行时选择不同的策略来执行特定功能;而状态模式则强调对象在不同状态下自动改变行为,状态的切换驱动着行为的变化。​

类图

角色

  • state:抽象状态对象​
  • 抽象状态对象是状态模式的基石,它负责定义对象的状态,并封装了环境角色以实现状态转换。通常以抽象类或接口的形式存在,为具体状态角色提供统一的行为接口。在这个抽象层面,虽然不涉及具体的行为实现,但规定了所有具体状态类必须实现的方法,这些方法涵盖了在该状态下对象可能执行的各种操作。例如,在一个文档审批系统中,抽象状态类可能定义了 “提交审批”“批准”“拒绝” 等方法,不同的具体状态(如 “待审批状态”“审批通过状态”“审批拒绝状态”)将根据自身逻辑实现这些方法。​

  • ConcreteState:具体状态角色​
  • 具体状态角色是抽象状态的具体实现,承担着两项重要职责。其一,管理本状态下对象的行为,即实现抽象状态类中定义的方法,以符合该状态下对象应有的行为表现。比如在一个电商订单系统中,“已支付状态” 的具体状态类会实现 “发货” 方法,而 “未支付状态” 的具体状态类则可能将 “发货” 方法实现为空操作或者抛出提示用户先支付的异常。其二,负责趋向状态管理,也就是定义本状态如何过渡到其他状态。例如,在 “已支付状态” 下,当用户取消订单时,可能会切换到 “订单取消状态”。每个具体状态类都专注于自身状态相关的逻辑,使得代码的职责更加清晰,易于维护和扩展。​

  • Context: 环境角色​
  • 环境角色是状态模式中的核心协调者,它定义了客户端所需要的接口,客户端通过与环境角色交互来间接操作对象的状态和行为。环境角色内部维护着一个当前状态的引用,这个引用指向具体的状态对象。当客户端调用环境角色的方法时,环境角色会将请求委托给当前的状态对象进行处理。同时,环境角色还负责具体状态的切换,当满足特定条件时,它会改变当前状态的引用,使对象切换到新的状态,从而自动改变对象的行为。以一个自动售货机为例,售货机本身就是环境角色,它维护着机器的当前状态(如 “


http://www.kler.cn/a/589610.html

相关文章:

  • 【CVPR 2025】局部区域自注意力LASA,用重叠补丁增强区域特征交互,即插即用!
  • 【Mac 从 0 到 1 保姆级配置教程 08】08. 快速配置 Neovim、LazyVim 以及常用开发环境,如果之前有人这么写就好了
  • 【JavaEE】Spring Boot 日志
  • Qt:槽函数与信号
  • 下载 CSS 文件阻塞,会阻塞构建 DOM 树吗?会阻塞页面的显示吗?
  • python项目一键加密,极度简洁
  • 使用Appium的W3C Actions实现多指触控行为
  • C++ STL 之常用拷贝和替换算法①copy();②replace();③replace_if();④swap();
  • C++ STL map
  • Spring Boot 动态配置管理:ZooKeeper 集成与 Redis 配置覆盖实践
  • easypoi导入Excel兼容日期和字符串格式的日期和时间
  • OpenCV计算摄影学(23)艺术化风格化处理函数stylization()
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 的自动配置:约定优于配置的设计美学
  • Vue 登录 记住密码,设置存储时间
  • ROS学习过程记录(二)
  • Spark 优化作业性能以及处理数据倾斜问题
  • 天梯赛 L2-002 链表去重
  • 深度学习在医学影像分析中的应用:DeepSeek系统的实践与探索
  • SwanLab邮件通知插件:训练完成收到邮件,掌握训练进度更及时
  • 全栈网络安全-渗透测试-2