Java状态设计模式

news/2024/4/25 7:56:16/文章来源:https://blog.csdn.net/qq_40673786/article/details/131714711

Java状态设计模式

定义

状态模式是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。状态模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。

对应角色

  • 环境(Context):定义客户端需要的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象处理。
  • 抽象状态(State):定义一个接口,用于封装与环境(Context)的一个特定状态相关的行为。
  • 具体状态(Concrete State):实现抽象状态(State)接口,具体实现与环境(Context)的一个特定状态相关的行为。

优缺点

优点

  • 可以将不同的状态隔离,每个状态都是一个单独的类
  • 可以将各种状态的转换逻辑,分布到状态的子类中,减少相互依赖
  • 增加新状态,操作简单

缺点

  • 如果状态数量比较多,状态类的数量会增加,业务场景系统变得很复杂
  • 如果业务中某个对象由几十上百个状态,就会很复杂,这时就需要对状态进行拆分处理

应用场景

  • 一个对象的行为依赖于它的状态,并且它必须在运行时根据状态改变它的行为。
  • 需要编写大量的条件分支语句来决定一个操作的行为,而且这些条件恰好表示对象的一种状态。
  • 对象存在多个状态,状态可以相互转换,不同状态下,行为不同。

实例

这是一个简单的Java状态设计模式的例子。它定义了一个Context类,一个State接口和两个实现State接口的具体状态类。Context类包含一个State类型的成员变量来表示它当前的状态,并且提供了一个方法来改变状态。

interface State {public void doAction(Context context);
}class StartState implements State {public void doAction(Context context) {System.out.println("Player is in start state");context.setState(this);}public String toString(){return "Start State";}
}class StopState implements State {public void doAction(Context context) {System.out.println("Player is in stop state");context.setState(this);}public String toString(){return "Stop State";}
}class Context {private State state;public Context(){state = null;}public void setState(State state){this.state = state;}public State getState(){return state;}
}public class StatePatternDemo {public static void main(String[] args) {Context context = new Context();StartState startState = new StartState();startState.doAction(context);System.out.println(context.getState().toString());StopState stopState = new StopState();stopState.doAction(context);System.out.println(context.getState().toString());}
}

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

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

相关文章

报错400是什么怎么解决呢?

首先要了解400错误是什么错误: HTTP状态码400表示"错误请求"。它是一种客户端错误状态码,表示服务器无法理解请求的语法或参数。当服务器收到一个无效的请求时,通常会返回400错误码。这可能是由于请求中缺少必要的参数、参数格式错…

关于AWS MSK Connector Execution Role的解释

尽管在创建AWS MSK Connector时,Execution Role是一个必填项,就像下面这样: 并且在官方文档中给出的Execution Role样例: https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-service-execution-role.html 中也…

linux X系统 X窗口系统(X Window System)

Xorg是一个开放源代码的跨平台的图形系统,它是UNIX和Linux的主要图形系统,它的前身是XFree86。 Xorg是在桌面环境中提供显示和图形输入设备支持的主要架构。 它支持多种输入设备,如键盘,鼠标,触摸屏,手写板…

电能管理系统在路店上的应用 安科瑞 许敏

摘要:随着企业改革的不断深入,对现代化用电管理的水平要求越来越高,准确、快速、经济的获得用电回路的各类数据进行用电分析、负荷管理、表计运行状况监测、电费自动结算的基础。同时也是提高企业经济效益的有效手段。近年来技术人员对监控系…

「解决方案」如何通过WiFi蓝牙二合一模块实现智能控制-工业控制

在物联网急速发展的现今,智能家居,智慧工业场景主流的智能控制方案多依赖于wifi技术,蓝牙技术来实现。而蓝牙-Wifi双模SOC方案,凭借集成wifi、蓝牙技术的低功耗、低成本,配网成功率高等特点,也在物联网智能…

24种人格力量,好奇心的力量以及特征分析

人格力量是一种可支配的价值观,它能让人向往美好的远景,极大地促进人的工作发展。via认为好奇心是人格力量的种类之一。 借助via 24种人格力量测试,探索人格优势,可以帮助我们更好的发现自身的优势,发挥自己的潜能。从…

REMB-接收端最大接收码率评估

draft-alvestrand-rmcat-remb-03 接收方带宽估计的RTCP消息 REMB_fanyamin的博客-CSDN博客 webrtc中的码率控制_webrtc设置码率_linux_vae的博客-CSDN博客 参考: Walter: WebRTC 拥塞控制之 REMB - 接收方带宽估计 - 简书 WebRTC基于TransportCC和Trendline Fil…

[java安全]URLDNS

文章目录 [java安全]URLDNS前言HashMapURLURLStreamHandler调用过程调用链流程图POC [java安全]URLDNS 前言 URLDNS利用链是一条很简单的链子,可以用来查看java反序列化是否存在反序列化漏洞,如果存在,就会触发dns查询请求 它有如下优点&a…

探索Python异常:让程序不再崩溃!

文章目录 前言什么是异常捕获异常基本语法捕获指定类型异常捕获多个指定类型的异常捕获异常描述信息捕获所有异常elsefinally 异常的嵌套自定义异常结语 前言 在编程的世界中,我们常常会面对各种各样的错误和异常情况。尤其当我们使用Python这样的高级编程语言时&a…

MySQL [环境配置]

MySQL [环境配置] MySQL的下载sqlyog的下载 熟悉老陈的人, 都清楚我不喜欢写这些环境配置的博客 那为啥这次要写一下MySQL的环境配置呢? 因为我被这一个小小的环境配置困扰了很长时间, 淋过雨的人都想为别人撑一把伞, 我不希望我的铁汁们也被这个问题困扰 MySQL的下载 MySQL下…

使用git克隆非自己账号的项目

在地址的中https://或者http://后添加要使用的 账号名项目地址,就会提示输入对应账号的密码,进行克隆。 如果克隆别人的项目,你将别人给你的项目地址克隆,此时身份验证是别人的用户名,这时你输入自己的密码就会验证失败…

在 3ds Max 中对二战球形炮塔进行建模

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 实际上被称为“斯佩里球炮塔”,它被用于二战的B-17和B-24轰炸机。 本教程介绍如何在 3ds Max 中对球形转塔进行建模。建模时,您将使用背景图片作为辅助。首先创建一个低多边形球体。…

thinkphp 上传图片

public function upload_img(){// 读取图片资源// 存储路径$path "uploads/avatar";$file request()->file(background_img);// 存储图片$info $file->rule(uniqid)->move($path);// 存储成功if ($info) {//获取到上传图片的路径名称$name_img $path . …

metersphere数据库SQL断言应用

在使用metersphere的时候,需要查询数据库数据来验证接口是否正常,在查看使用手册时,发现不是很明确,在研究一点时间后,终于明白,在此写下心得。 metersphere使用手册地址:接口测试 - 接口用例操…

界面控件DevExtreme v23.1新版亮点 - 全新的DateRangeBox组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

语义分割混淆矩阵、 mIoU、mPA计算

一、操作 需要会调试代码的人自己改,小白直接运行会出错 这是我从自己的大文件里摘取的一部分代码,可以运行,只是要改的文件地址path比较多,遇到双引号“”的地址注意一下,不然地址不对容易出错 把 calculate.py和 u…

干货 | 一个漏洞利用工具仓库

0x00 Awesome-Exploit 一个漏洞证明/漏洞利用工具仓库 不定期更新 部分漏洞对应POC/EXP详情可参见以下仓库: https://github.com/Threekiii/Awesome-POC https://github.com/Threekiii/Vulhub-Reproduce 0x01 项目导航 ActiveMQ CVE-2015-5254 Apisix CVE-2…

Unreal Engine 与 Blender - 比较指南

虚幻引擎和 Blender 是游戏开发人员中最常用的两种软件,它们在游戏开发工作流程中都有自己的用途和地位。作为进入视频游戏行业的初学者,可能很难从数十种软件中筛选找到最适合您需求的一款。希望本指南能够缓解这一困难并帮助您决定选择哪个软件。 虚幻…

前端面试题-js(三)

31 介绍js有哪些内置对象 Object 是 JavaScript 中所有对象的⽗对象数据封装类对象: Object 、 Array 、 Boolean 、 Number 和 String其他对象: Function 、 Arguments 、 Math 、 Date 、 RegExp 、 Error 32 说⼏条写JavaScript的基本规范 不要在同…