设计模式-状态模式(State Pattern)结构|原理|优缺点|场景|示例

news/2024/5/19 5:07:36

                                     设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式    


状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。这种模式主要用于当一个对象的行为依赖于它的状态(即内部状态),并且它必须在运行时根据状态改变它的行为时。

结构: 状态模式主要包含以下几个角色:

  1. Context(环境类/上下文):定义了客户感兴趣的接口,并维护一个具体状态对象的引用,将与状态相关的操作委托给当前状态对象处理。
  2. State(抽象状态类):定义一个接口,用以封装使用上下文环境的各个状态所对应的行为。
  3. ConcreteState(具体状态类):实现抽象状态类定义的接口,每一个具体状态类对应上下文的一个具体状态,负责实现该状态下对应的行为。

原理:

  • 上下文对象持有一个状态对象的引用,这个状态对象决定了上下文对象的行为。
  • 当上下文对象的内部状态改变时,它会改变所持有的状态对象,从而改变其行为。
  • 上下文对象不需要知道具体状态类的细节,只需要通过抽象状态类的接口与状态对象交互。

优缺点: 优点:

  • 结构清晰,将状态相关的代码组织在一起,符合单一职责原则。
  • 将状态转换的逻辑封装在状态类中,使得状态转换逻辑与上下文对象分离,易于扩展新的状态和转换逻辑。
  • 提高了对象的可扩展性和可维护性。

缺点:

  • 如果状态过多,会导致类的个数增加,系统复杂度上升。
  • 状态模式的使用需要合理判断,避免过度设计。

应用场景:

  • UI控件的状态变化,如按钮的禁用/启用状态。
  • 状态机的实现,如ATM机的不同操作状态。
  • 工作流系统,如订单处理的不同阶段。

代码示例(以Java为例)

// 抽象状态类
interface PlayerState {void play();void stop();void pause();
}// 具体状态类:播放状态
class PlayingState implements PlayerState {@Overridepublic void play() {System.out.println("Already playing.");}@Overridepublic void stop() {System.out.println("Stopping the player.");}@Overridepublic void pause() {System.out.println("Pausing the player.");// 可能会在这里切换到暂停状态(PauseState)}
}// 具体状态类:暂停状态
class PausedState implements PlayerState {@Overridepublic void play() {System.out.println("Resuming the player.");}@Overridepublic void stop() {System.out.println("Stopping the player.");}@Overridepublic void pause() {System.out.println("Player is already paused.");}
}// 上下文类:播放器
class MediaPlayer {private PlayerState state;public MediaPlayer() {this.state = new StoppedState(); // 初始状态设为停止状态}public void setState(PlayerState state) {this.state = state;}public void play() {state.play();}public void stop() {state.stop();}public void pause() {state.pause();}
}// 示例使用
public class StatePatternDemo {public static void main(String[] args) {MediaPlayer player = new MediaPlayer();player.play(); // 输出:Starting the player.player.pause(); // 输出:Pausing the player.player.stop(); // 输出:Stopping the player.}
}

        在这个例子中,MediaPlayer是上下文,它维护了一个PlayerState的实例,通过调用play()stop()pause()等方法,实际上是由当前状态对象决定具体的行为。随着状态的改变,播放器的行为也会相应变化。


http://www.mrgr.cn/p/73171430

相关文章

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层:构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories:后端开发tags:Django模板 表单处理 静态文件 国际化 性能优化 安全防护 部署实践第一章:模板语法基础 Django模板语法介绍 Django模板语法是一种简洁而强大的…

第一阶段复习

目录最短路部分最小环传递闭包Dij证明反图负环最短路计数次短路分层图的几个典例最短路结合二分 最短路部分 最小环 一些细节:枚举最小环是依据还没有更新经过k的最短路,所以要写在更新经过k的最短路之前。要判断是否存在路径。ijk三指针需要i与k、j与k相连。 传递闭包 f[i][…

开源运维监控平台【WGCLOUD】的调研报告 2024

WGCLOUD是一款开源免费的运维监控软件,具有设计严谨,功能丰富,部署简单,上手学习容易,性能优秀,免费开源开放等特点 网站下载:www.wgstart.com 1、WGCLOUD可以监控各种主机,包括物理机、实体机、虚拟机、云主机、VPS等主机或者服务器 监控指标数据包括:操作系统信息,…

面试必问并发编程内存模型JMM与内存屏障剖析 学习

总课程:1、JMM。每个线程会产生一个变量副本。如下图所示,第二个变量修改了变量initFlag,但线程1并不会退出,是因为每个线程产生了副本。----解决方法:volatileCPU缓存一致性协议:MESI机制,以及内存模型底层八大原子操作。Volatile缓存可见性实现原理:底层实现主要通过…

【详细教程】手把手教你开通YouTube官方API接口(youtube data api v3)

马哥原创教程:开通youtube的API,方便后续调用接口实现爬虫。一、背景调查 1.1 youtube介绍 众所周知,youtube是目前全球最大的视频社交平台,该平台每天产生大量的视频内容,涵盖各种主题和类型,从音乐视频到教育内容,再到娱乐节目和新闻报道等。YouTube的用户群体也非常广…

工作问题记录React(持续更新中)

一、backdrop-filter:blur(20px); 毛玻璃效果,在安卓机上有兼容问题,添加兼容前缀也无效; 解决方案:让设计师调整渐变,不要使用该属性! 复制代码 background: radial-gradient(33% 33% at 100% 5%, #e9e5e5 0%, rgba…

SQL注入漏洞--报错/union/布尔盲注/时间盲注

之前介绍了数据库的基本操作,今天这篇文章就来实操SQL注入。 阅读本文前可以先看一下基本操作,有助于更好理解本文。。。 https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502 what SQL---结构化查询语言---S…

spring项目创建

从spring initializer下载一个demo Spring boot 在idea中 需要配置java版本和maven版本之后:mvn package不需要下载tomcat,Spring里面pom中包含内置tomcat<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…

库存管理系统开源啦

软件介绍 ModernWMS是一个针对小型物流仓储供应链流程的开源库存管理系统。该系统的开发初衷是为了满足中小型企业在有限IT预算下对仓储管理的需求。通过总结多年ERP系统研发经验&#xff0c;项目团队开发了这套适用于中小型企业的系统&#xff0c;以帮助那些有特定需求的用户。…

华为鸿蒙系统(Huawei HarmonyOS)

华为鸿蒙系统&#xff08;华为技术有限公司开发的分布式操作系统&#xff09; 华为鸿蒙系统&#xff08;HUAWEI HarmonyOS&#xff09;&#xff0c;是华为公司在2019年8月9日于东莞举行的华为开发者大会&#xff08;HDC.2019&#xff09;上正式发布的分布式操作系统。 华为鸿蒙…

数仓开发:DIM层数据处理

一、了解DIM层 这个就是数仓开发的分层架构 我们现在是在DIM层&#xff0c;从ods表中数据进行加工处理&#xff0c;导入到dwd层&#xff0c;但是记住我们依然是在DIM层&#xff0c;而非是上面的ODS和DWD层。 二、处理维度表数据 ①先确认hive的配置 -- 开启动态分区方案 -- …

高一下三调|ssy的队列|hash dp|题解

SSY的队列题目链接 解析: 考场上看到这个题第一眼是绝望的,毕竟数论咱是一窍不通. 但是往下细看了看这个数据范围,N是很小的,就想了想模拟. 然而只骗到10分. 这个题绩效较高的解法是状压dp,在N<15的范围之内均可薄纱(ppllxx_9G也是成功拿到这70 rank 1了 orz),可得70,但是一…

Git——关于Git的一些补充(1)

Git——关于Git的一些补充(1) 提示:图床在国外且动图比较多的情况下,需要时间加载。 目录: 目录Git——关于Git的一些补充(1)提示:图床在国外且动图比较多的情况下,需要时间加载。目录:Git基础Git文件的生命周期Git文件的存储空间的划分Git安装过程补充说明Git的撤销…

UHF RFID 使用小记

1,概念 UHF:Ultra High Frequency;超高频。 RFID:Radio Frequency Identification;射频识别。 电子标签:即RFID标签,是RFID的俗称。 PDA:Personal Digital Assistant;个人数字助理。 发卡器:对卡进行读写操作的工具。 EPC:Electronic product code;电子产品代码。 …

企业计算机服务器中了lockbit勒索病毒如何处理,lockbit勒索病毒解密流程建议

在虚拟的网络世界里&#xff0c;人们利用网络获取信息的方式有很多&#xff0c;网络为众多企业提供了极大便利性&#xff0c;也大大提高了企业生产运营效率&#xff0c;方便企业开展各项工作业务。但随着网络技术的不断发展与应用&#xff0c;越来越多的企业开始关注企业网络数…

RAGFlow:安装与体验

服务器需要有docker,或者直接访问官方提供的demo: https://demo.ragflow.io/ docker-compose安装 需要确保 vm.max_map_count 不小于 262144 【更多】:sysctl -w vm.max_map_count=262144 克隆仓库:$ git clone https://github.com/infiniflow/ragflow.git 进入 doc…

文学作品|在线阅读

分享文字和音频类的文学作品,陶冶情操,宣传正能量。#wh-tab{font-size:20px;text-align:center;}a:link {text-decoration: none;}td{font-size: 16px;text-align:center;}td:empty:after{content:虚位以待;color:grey;} 前言 若有空,将古今中外的常见文学作品挂载在网络上,…

[转]ptp(precision time protocol)时钟同步

一、介绍1:什么是ptpPTP(Precision Time Protocol) 是一个通过网络同步时钟的一个协议。当硬件支持时,PTP 精度能达到亚微秒,比 NTP(Network Time Protocol)精度更高。 2:ptp应用场景1)数据中心数据中心需要NTP/PTP同步,以确保集群的时域运行。同步对于虚拟机计算是必不…

轨道交通巡检机器人的应用范围

在现代轨道交通系统的庞大网络中&#xff0c;无数的轨道、设备和设施交织在一起&#xff0c;如同一个精密的机器在高效运转。而在这背后&#xff0c;轨道交通巡检机器人正悄然登场&#xff0c;它们如同一个个智能的守护者&#xff0c;穿梭于各个场景之中。那么&#xff0c;这些…

3. SpringBoot 整合第三方技术

1. 整合Junit 一般来说是不需要进行处理的 ,因为在创建SpringBoot 工程时 ,会自动整合junit​的 要说怎么配置的话?也可以写一下相关的配置:以下就是SpringBoot 整合 Junit 相关步骤导入相关依赖 <dependency><groupId>org.springframework.boot</groupId&g…