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

【设计模式】JAVA Design Patterns——State(状态模式)

🔍目的


允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。

🔍解释


真实世界例子

当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的环境感到愤怒和危险

通俗描述

状态模式允许对象改变它的行为

维基百科

状态模式是一种允许对象在内部状态改变时改变它的行为的行为型设计模式。这种模式接近于有限状态机的概念。状态模式可以被理解为策略模式,它能够通过调用在模式接口中定义的方法来切换策略。

程序示例

创建模式接口和它具体的实现

public interface State {void onEnterState();void observe();
}public class PeacefulState implements State {private static final Logger LOGGER = LoggerFactory.getLogger(PeacefulState.class);private final Mammoth mammoth;public PeacefulState(Mammoth mammoth) {this.mammoth = mammoth;}@Overridepublic void observe() {LOGGER.info("{} is calm and peaceful.", mammoth);}@Overridepublic void onEnterState() {LOGGER.info("{} calms down.", mammoth);}
}public class AngryState implements State {private static final Logger LOGGER = LoggerFactory.getLogger(AngryState.class);private final Mammoth mammoth;public AngryState(Mammoth mammoth) {this.mammoth = mammoth;}@Overridepublic void observe() {LOGGER.info("{} is furious!", mammoth);}@Overridepublic void onEnterState() {LOGGER.info("{} gets angry!", mammoth);}
}

创建包含状态的长毛象

public class Mammoth {private State state;public Mammoth() {state = new PeacefulState(this);}public void timePasses() {if (state.getClass().equals(PeacefulState.class)) {changeStateTo(new AngryState(this));} else {changeStateTo(new PeacefulState(this));}}private void changeStateTo(State newState) {this.state = newState;this.state.onEnterState();}@Overridepublic String toString() {return "The mammoth";}public void observe() {this.state.observe();}
}

 创建长毛象随着时间的推移后的整个行为示例

    var mammoth = new Mammoth();mammoth.observe();mammoth.timePasses();mammoth.observe();mammoth.timePasses();mammoth.observe();// The mammoth gets angry!// The mammoth is furious!// The mammoth calms down.// The mammoth is calm and peaceful.

🔍类图


🔍适用场景

在以下两种情况下,请使用State模式

  • 对象的行为取决于它的状态,并且它必须在运行时根据状态更改其行为。
  • 根据对象状态的不同,操作有大量的条件语句。此状态通常由一个或多个枚举常量表示。通常,几个操作将包含此相同的条件结构。状态模式把条件语句的分支分别放入单独的类中。这样一来,你就可以将对象的状态视为独立的对象,该对象可以独立于其他对象而变化。

🔍Ending


State(状态)模式是一种对象行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。State模式的核心思想是将对象的行为封装在不同的状态对象中,并且使得对象在不同状态下可以切换。


希望本文能够帮助读者更深入地理解状态模式,在实际项目中发挥其优势。谢谢阅读!


希望这份博客草稿能够帮助到你。如果有其他需要修改或添加的地方,请随时告诉我

相关文章:

【设计模式】JAVA Design Patterns——State(状态模式)

🔍目的 允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。 🔍解释 真实世界例子 当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的…...

Docker搭建可道云

Docker搭建可道云(存储) 文章目录 Docker搭建可道云(存储)介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、搭建可道云私有云盘3.1、编写Dockerfile3.2、上传资源到指定目录3.3、查看目录下所有资源 四、构建镜像五、…...

【RISC-V】站在巨人的肩膀上——看开源芯片、软件生态、与先进计算/人工智能/安全的结合

目录 会议议程前言开源处理器芯片的机遇与挑战,孙凝晖,中国工程院院士RISC-V原生基础软件栈,武延军,中国科学院软件研究所RISC-V推动新型架构创新,孟建熠,浙江大学 专题一:开源芯片开源高性能 R…...

test 判断字符串不为空

#!/bin/bash read -p "请输入参数:" name test -z $name if [ $? -eq 1 ]; then echo "入参:$name" else echo "入参为null" fi...

Python数据分析I

目录 注:简单起见,下文中"df"均写为"表名","函数"均写为"HS","属性"均写为"SX","范围"均写为"FW"。 1.数据分析常用开源库 注释…...

Qt5/6使用SqlServer用户连接操作SqlServer数据库

网上下载SQLServer2022express版数据库,这里没啥可说的,随你喜欢,也可以下载Develop版本。安装完后,我们可以直接连接尝试, 不过一般来说,还是下载SQLServer管理工具来连接数据更加方便。 所以直接下载ssms, 我在用的时候,一开始只能用Windows身份登录。 所以首先,我…...

[经验] 场效应管是如何发挥作用的 #知识分享#学习方法#职场发展

场效应管是如何发挥作用的 在现代电子技术领域,场效应管(MOSFET)是一种重要的半导体元器件。它的作用非常广泛,例如在集成电路中扮演着关键的角色。在本文中,我们将详细探讨场效应管的作用及其在实际应用中的意义。 简…...

数据挖掘--分类

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析:基本概念和方法 基本概念 决策树归纳 决策树:决策树是一…...

数据结构篇其六-串

数据结构—串 前置说明 由于学习Java面向对象语言走火入魔,试图在C语言中模拟实现面向对象设计。里面加入了大量的函数指针配合结构体来模拟类中的成员方法 故此篇,亦可称: 面向对象的C语言程序设计 用C语言实现串这种数据结构,并将它应用到…...

队列和栈的实现

本节讲解的队列与栈,如果你对之前的线性和链式结构顺利掌握了,那么下边的队列和栈就小菜一碟了。因为我们会用前两节讲到的东西来实现队列和栈。 之所以放到一起讲是因为这两个东西很类似,队列是先进先出结构(FIFO, first in first out)&…...

lua vm 五: upvalue

前言 在 lua vm 中,upvalue 是一个重要的数据结构。upvalue 以一种高效的方式实现了词法作用域,使得函数能成为 lua 中的第一类值,也因其高效的设计,导致在实现上有点复杂。 函数 (proto) upvalue 构成了闭包(closu…...

React Native中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据

在您的数据采集上传的应用中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据是一项常见需求。下面是如何实现这些功能的详细指南,包括具体步骤和示例代码。 1. 显示地图 原生开发 Android: 使用ArcGIS Android SDK。您需要在AndroidManifest…...

java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常

一、概述 1、java程序员在编写程序时提前编写好对异常的处理程序,在程序发生异常时就可以执行预先设定好的处理程序,处理程序执行完之后,可以继续向后执行后面的程序 2、异常处理程序是在程序执行出现异常时才执行的 二、5个关键字 1、tr…...

深入了解反射

newInstance 可访问性限制: newInstance()方法只能调用无参的公共构造函数。如果类没有无参公共构造函数,那么newInstance()方法将无法使用。 异常处理: newInstance()方法在创建对象时会抛出受检异常InstantiationException和IllegalAcces…...

5、搭建前端项目

5.1 使用vite vue搭建 win r 打开终端 切换到你想要搭建的盘 npm init vitelatest跟着以下步骤取名即可 cd fullStackBlognpm installnpm run dev默认在 http://localhost:5173/ 下启动了 5.2 用vscode打开项目并安装需要的插件 1、删除多余的 HelloWorld.vue 文件 2、安装…...

LLM之Agent初探

Agent是什么? Agent一词起源于拉丁语中的Agere,意思是“to do”。在LLM语境下,Agent可以理解为在某种能自主理解、规划决策、执行复杂任务的智能体。 Agent并非ChatGPT升级版,它不仅告诉你“如何做”,更会帮你去做。…...

目录穿越漏洞CVE-2018-7171复现 又学到一招小技巧!!!!

还是半夜睡不着,打开靶机开始操作。今天看了文件下载和目录穿越漏洞想结合以及防御方法。半夜来进行操作一波。复现一下漏洞,这个网上的文章页比较的少!!! 开始操作起来!!! 进入到页…...

代码随想录算法训练营day41

题目:01背包理论基础、416. 分割等和子集 参考链接:代码随想录 动态规划:01背包理论基础 思路:01背包是所有背包问题的基础,第一次看到比较懵,完全不知道dp数据怎么设置。具体分析还是dp五部曲&#xff…...

从0~1开发财务软件

1.获取图形验证码接口 功能要求 1、随机生成6位字符 2、将字符生成base64位格式的图片,返回给前端 3、将生成的字符存储到redis中,用匿名身份id(clientId)作为key,验证码作为value。 clientId通过/login/getClien…...

Python实现连连看9

(2)标识选中的图片 在判断出玩家选中的是哪一张图片之后,接下来就可以标识选中的图片了,即在该选中的图片外围画矩形。代码如下所示。 FIRSTCLICK True #FIRSTCLICK是全局变量 if(click_col>0 and click_row>0) and \(no…...

如何永久保存微信聊天记录?WeChatExporter一站式解决方案

如何永久保存微信聊天记录?WeChatExporter一站式解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 在数字时代,微信聊天记录承载着我们的工…...

如何突破百度网盘下载限速?这款开源工具让你重获高速下载自由

如何突破百度网盘下载限速?这款开源工具让你重获高速下载自由 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 还在为百度网盘那令人绝望的下载速度而苦恼吗?当你看着进度条缓慢爬行,大文件…...

基于Athena-Public框架的LLM全栈应用开发实践与架构解析

1. 项目概述与核心价值 最近在梳理一些开源项目时,发现了一个名为“Athena-Public”的仓库,作者是winstonkoh87。这个项目名听起来就很有意思,Athena(雅典娜)是智慧女神,一个公开的“智慧”项目&#xff0c…...

告别重启!IDEA里用JRebel插件实现Java代码秒级热更新(附最新激活与配置避坑指南)

告别重启!IDEA里用JRebel插件实现Java代码秒级热更新(附最新激活与配置避坑指南) 作为一名长期与Java打交道的开发者,你是否经历过这样的痛苦循环:修改一行代码 → 保存 → 等待漫长的Tomcat重启 → 验证修改 → 发现…...

保姆级教程:在Ubuntu 20.04上用PyTorch 1.12和YOLOv5s完整训练COCO数据集(附时间预估与常见坑点)

从零开始:Ubuntu 20.04下YOLOv5s训练COCO数据集的实战指南 引言 在计算机视觉领域,目标检测一直是核心研究方向之一。YOLO(You Only Look Once)系列算法因其出色的实时性和准确性,成为工业界和学术界的宠儿。本文将带你从零开始,在…...

一文搞定!Robot Framework自动化测试从入门到实战(全栈)

1. Robot Framework初探:为什么选择它? 第一次接触Robot Framework(简称RF)是在五年前的一个企业测试项目中。当时团队需要快速搭建一套支持Web、API和移动端测试的自动化方案,而RF凭借其零编码门槛和全栈支持能力成为…...

手机号定位终极指南:3分钟搭建免费归属地查询系统

手机号定位终极指南:3分钟搭建免费归属地查询系统 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors/…...

Jenkins Job DSL与Pipeline集成:现代DevOps工作流的10个最佳实践

Jenkins Job DSL与Pipeline集成:现代DevOps工作流的10个最佳实践 【免费下载链接】job-dsl-plugin A Groovy DSL for Jenkins Jobs 项目地址: https://gitcode.com/gh_mirrors/jo/job-dsl-plugin Jenkins Job DSL插件是现代DevOps自动化中不可或缺的工具&…...

从90%到99%:实战提升Tesseract在C++项目中的识别准确率(附调参技巧)

从90%到99%:实战提升Tesseract在C项目中的识别准确率(附调参技巧) 在工业级文档处理系统中,我们常遇到这样的困境:测试集上的OCR识别准确率卡在90%左右,而业务部门要求必须达到99%以上才能上线。去年负责某…...

告别I2C的龟速:用STM32的SPI接口榨干ICM20948的性能(实测对比与配置优化)

突破传感器性能瓶颈:STM32 SPI驱动ICM20948的极致优化实践 在无人机飞控、姿态解算和高频数据采集领域,传感器接口的选择往往成为系统性能的决定性因素。当开发者面对ICM20948这款集成了三轴陀螺仪、加速度计和磁力计的9轴运动传感器时,一个关…...