状态模式S

状态模式(State Pattern)是行为设计模式的一种,它允许一个对象在其内部状态发生改变时改变其行为。这个对象被视为类型的有限状态机(Finite State Machine)。

在状态模式中,我们创建表示各种状态的对象和一个上下文对象(context),该上下文对象持有当前状态的引用,并可以在不同状态之间切换。这些状态对象共享一个公共的接口,以便上下文可以与任何状态对象交互,而无需知道具体是哪个状态。这样,当状态发生改变时,上下文的行为也会相应改变,但上下文本身并不直接修改其状态,而是委托给状态对象来处理状态的转换。

组成

‌状态接口或抽象类‌(State)

定义一个接口或抽象类,以封装与特定状态相关的行为。

‌具体状态类‌(Concrete State)

实现或继承状态接口或抽象类,每个具体状态类实现与状态相关的行为,并可以定义状态转换的逻辑。

‌上下文类‌(Context)

持有一个状态对象的引用,可以委托当前状态对象处理请求,从而使得上下文的行为随状态改变而改变。上下文类通常包含一个或多个与状态相关的方法,这些方法会调用状态对象的方法。

Demo

设计一个交通信号灯系统。交通信号灯有三种状态:红灯(Red)、绿灯(Green)和黄灯(Yellow)。我使用状态模式来实现信号灯状态的切换和状态相关的行为。

定义状态接口 TrafficLightState

package org.example.state;public interface TrafficLightState {void change(TrafficLight trafficLight);
}

状态接口具体的实现类 RedState,RedState,RedState

package org.example.state;public class RedState implements TrafficLightState{@Overridepublic void change(TrafficLight trafficLight) {System.out.println("Red Light -- Stop!");trafficLight.setState(new GreenState());}
}
package org.example.state;public class GreenState implements TrafficLightState{@Overridepublic void change(TrafficLight trafficLight) {System.out.println("Green Light -- Go!");trafficLight.setState(new YellowState());}
}
package org.example.state;public class YellowState implements TrafficLightState{@Overridepublic void change(TrafficLight trafficLight) {System.out.println("Yellow Light -- Gaution!");trafficLight.setState(new RedState());}
}

创建一个 TrafficLight 类作为上下文

package org.example.state;public class TrafficLight {private TrafficLightState state;public TrafficLight() {this.state = new RedState();}public void setState(TrafficLightState state) {this.state = state;}public void change() {state.change(this);}
}

测试

package org.example.state;public class StateMain {public static void main(String[] args) {TrafficLight light = new TrafficLight();for (int i = 0; i <= 10; i++) {light.change();}}
}

<font style="color:rgb(51, 51, 51);">LightState</font>接口定义了一个<font style="color:rgb(51, 51, 51);">pressButton</font>方法,该方法用于处理按下按钮时的行为。<font style="color:rgb(51, 51, 51);">OnState</font><font style="color:rgb(51, 51, 51);">OffState</font>类实现了这个接口,并分别定义了开状态和关状态下按下按钮的行为。<font style="color:rgb(51, 51, 51);">LightSwitch</font>类持有一个<font style="color:rgb(51, 51, 51);">LightState</font>对象的引用,并通过<font style="color:rgb(51, 51, 51);">pressButton</font>方法委托当前状态对象处理按下按钮的请求。在客户端代码中,我们创建了一个<font style="color:rgb(51, 51, 51);">LightSwitch</font>对象,并模拟了按下按钮的动作,可以看到电灯的状态在开和关之间切换

优点

  • ‌封装性良好‌:状态模式将状态相关的行为封装在独立的状态类中,使得状态的变化对上下文类来说是透明的。
  • ‌扩展性强‌:通过添加新的状态类,可以很容易地扩展系统的行为,而无需修改现有的代码。
  • ‌维护性高‌:状态模式使得状态转换和状态相关的行为明确且集中,有助于代码的维护和调试。
  • ‌解耦‌:状态模式将状态的行为与上下文类解耦,使得上下文类可以专注于处理业务逻辑,而无需关心状态的具体实现。

缺点

  • ‌类数量增加‌:每个状态都需要一个单独的类,这会导致系统的类数量增加,从而增加了管理的复杂性。
  • ‌逻辑分散‌:状态转换和状态相关的行为被分散到多个状态类中,这可能会使得理解和跟踪系统行为变得更加困难。
  • 适用场景

适用场景

对象的行为取决于其状态,并且这些状态在运行时会发生变化。需要使用大量的条件语句(如if-else或switch-case)来根据对象的状态选择其行为,这时可以考虑使用状态模式来替代这些条件语句,以提高代码的可读性和可维护性。

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

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

相关文章

Webman中实现定时任务

文章目录 Webman中实现定时任务一、引言二、安装与配置1、安装Crontab组件2、创建进程文件3、配置进程文件随Webman启动4、重启Webman5、Cron表达式&#xff08;补充&#xff09;例子 三、使用示例四、总结 Webman中实现定时任务 一、引言 在现代的后端开发中&#xff0c;定时…

瀚高创库建表pgsql

1.瀚高下载地址&#xff1a; 下载 (highgo.com)https://www.highgo.com/down_main.html 2.瀚高linux安装 上传deb文件到ubuntu系统中 执行 dpkg -i hgdb-see-4.5.8-fe4791c.x86_64.deb 命令安装数据库 安装完成后&#xff0c;会在/opt 目录下生成安装目录 数据库安装完毕后…

5.11【机器学习】

先是对图像进行划分 划分完后&#xff0c; 顺序读取文件夹&#xff0c;在文件夹里顺序读取图片&#xff0c; 卷积层又称为滤波器&#xff0c;通道是说滤波器的个数&#xff0c;黑白通道数为1&#xff0c;RGB通道个数为3 在输入层&#xff0c;对于输入层而言&#xff0c;滤波…

Ajax基础总结(思维导图+二维表)

一些话 刚开始学习Ajax的时候&#xff0c;感觉很模糊&#xff0c;但是好像学什么都是这样的&#xff0c;很正常&#xff0c;但是当你学习的时候要持续性敲代码&#xff0c;边敲代码其实就可以理解很多了。然后在最后的总结&#xff0c;其实做二维表之后&#xff0c;就可以区分…

Python 自动化办公的 10 大脚本

大家好&#xff0c;我是你们的 Python 讲师&#xff01;今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作&#xff0c;提高效率。无论是处理 Excel 文件、发送邮件&#xff0c;还是自动化网页操作&#xff0c;Python 都能派上用场。 1. 批量…

【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

[Linux] 信号(singal)详解(一)

标题&#xff1a;[Linux] 信号(singal)详解 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、认识信号 1、认识信号 2、信号特点 3、基本概念 二、信号的产生&#xff08;5种方式&#xff09; 三、信号的保存 正文开始&#xff1a; 一、认识信号 1、认识信…

简单介绍下 VitePress 中的 vp-doc 和 vp-raw

VitePress 是一个轻量级的静态网站生成器&#xff0c;专为快速构建文档网站而设计。它是基于 Vite 和 Vue 3 构建的&#xff0c;旨在提供快速的开发体验和高效的构建过程。 存在两个需要注意的点&#xff1a;vp-doc 和 vp-raw&#xff0c;它们代表了不同的 CSS 样式类和用途&a…

服务器数据恢复—服务器raid0阵列硬盘指示灯显示黄颜色的数据恢复案例

服务器数据恢复环境&故障情况&#xff1a; 某品牌服务器上有一组由两块SAS硬盘组建的raid0阵列&#xff0c;上层是windows server操作系统ntfs文件系统。服务器上一个硬盘指示灯显示黄颜色&#xff0c;该指示灯对应的硬盘离线&#xff0c;raid不可用。 服务器数据恢复过程…

普及组集训--图论最短路径

定义&#xff1a;表示顶点u到顶点v的一条边的权值&#xff08;边权&#xff09; 最短路径算法有常见的四种&#xff1a;floyd&#xff0c;dijkstra&#xff0c;Bellman-Ford&#xff0c;SPFA 不过Bellman-Ford并不常用&#xff0c;所以本文不提&#xff1b; 重点在于dijkstr…

Linux内核ftrace的使用

文章目录 ftrace使用一、ftrace的功能与用途二、ftrace的实现原理三、ftrace的使用步骤1. 查看tracer&#xff1a;通过查看available\_tracers文件&#xff0c;了解当前内核中可用的插件追踪器2. 选择tracer3. 设置参数和过滤器4.开启追踪5. 读取追踪结果 四、ftrace的常用trac…

【笔记总结】华为云:应用上云后的安全规划及设计

一、背景和问题 数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;企业和各类组织纷纷将自身的应用程序迁移至云端。云计算凭借其诸多优势&#xff0c;如成本效益、可扩展性、灵活性以及便捷的资源共享等&#xff0c;已然成为了现代业务运营的重要支撑。 今年&#xf…

LeetCode-430. 扁平化多级双向链表-题解

题目链接 430. 扁平化多级双向链表 - 力扣&#xff08;LeetCode&#xff09; 题目介绍 你将得到一个双链表&#xff0c;节点包含一个“下一个”指针、一个“前一个”指针和一个额外的“子指针”。这个子指针可能指向一个单独的双向链表&#xff0c;并且这些链表也包含类似的特殊…

MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain

介绍 慢查询日志记录了所有执行时间超过指定参数(long_query_time&#xff0c;单位:秒&#xff0c;默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启&#xff0c;需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。 #开启慢查询开关 s…

【RL Application】语义分割中的强化学习方法

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

Elasticsearch 入门

Elasticsearch安装 下载软件 Elasticsearch 的官方地址:Elastic — 搜索 AI 公司 | Elastic Elasticsearch 最新的版本是 8.16.1(截止2024.11)&#xff0c;我们选择7.8.0版本。 下载地址&#xff1a;Elasticsearch 7.8.0 | Elastic Elasticsearch 分为Linux和 Windows版本&…

Pyside6-QTableView实战

使用效果 代码 import cv2 import osfrom ui.imageQuery import Ui_DialogImageQuery from utils.log_util import log_message from utils.sys_util import create_dirfrom PySide6.QtWidgets import QApplication, QDialog, QGraphicsPixmapItem, QGraphicsScene from PySid…

Redis开发03:常见的Redis命令

1.输入以下命令&#xff0c;启动redis。 sudo service redis-server start 如果你是直接安装在WSL的&#xff0c;搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏&#xff0c;直接打开Ubentu&#xff0c;输入账密后&#xff0c;输入“sudo service redis-server start”…

JAVA |日常开发中常见问题归纳讲解

JAVA &#xff5c;日常开发中常见问题归纳讲解 前言一、语法错误相关问题1.1 分号缺失或多余1.2 括号不匹配1.3 变量未定义或重复定义 二、数据类型相关问题2.1 数据类型不匹配2.2 整数溢出和浮点数精度问题 三、面向对象编程相关问题3.1 空指针异常&#xff08;NullPointerExc…

ubuntu的用户使用

ubuntu系统中的常规用户登录方式 在系统root用户是无法直接登录的,因为root用户的权限过大所以其安全性比较差 在登录系统时一般使用在安装系统时建立的普通用户登录 如果需要超级用户权限: Ubuntu用户密码破解 在系统安装完成后默认grub启动等待时间为0&#xff0c;建议改…