设计模式23——状态模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

状态模式(State)

对象行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、代码举例

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:


一、概述

1、当一个对象的内在状态改变时改变它的行为,这个对象看起来像是改变了其类。

1.1、直观的理解

假设一个对象有三种状态,A、B、C。对象的状态从A到B到C顺序轮流变换,由此它的行为也会发跟着发生变化,就像是换了一个对象一样。

当然也不一定非要是A-》B-》C,也可以在状态上加条件语句,使其可以有选择性的改变。就不再举例了。

但此模式具体运行的细节要比上述复杂一些:

1.2、主要角色:

  • 环境类:被表示状态的对象,也就是可以改变状态的类
  • 状态类:状态的抽象类或接口 + 状态的实现类,表示环境类的某个状态

1.3、描述对象之间关系的UML图:

也就是说每次调用 环境类 里的 更改状态() 方法就会改变状态:

  • 调用 环境类 里的 更改状态() 方法
  • 更改状态()方法会将自己通过 operation()方法 传递给当前的状态类对象
  • 状态类对象收到请求后根据一定的规则,然后将下一个状态再传回给 环境类

1.4、适用场景:

  • 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
  • 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

二、代码举例

就拿上述例子,状态由A到B再到C,循环变化。这个例子比较简单,就不再详细分析了。但你可以把本例当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:

状态的抽象类:

abstract class State {public abstract void handle(Context context);
}

状态A:

public class ConcreteStateA extends State {@Overridepublic void handle(Context context) {System.out.println("状态A");context.setState(new ConcreteStateB());//这里也可以条件语句判断下一个状态是谁}
}

状态B:

public class ConcreteStateB extends State {@Overridepublic void handle(Context context) {System.out.println("状态B");context.setState(new ConcreteStateC());//这里也可以条件语句判断下一个状态是谁}
}

状态C:

public class ConcreteStateC extends State {@Overridepublic void handle(Context context) {System.out.println("状态C");context.setState(new ConcreteStateA());//这里也可以条件语句判断下一个状态是谁}
}

环境类:

public class Context {private State state;public Context() {this.state = new ConcreteStateA();System.out.println("初始化以A开始!");}public State getState() {return state;}public void setState(State state) {this.state = state;}public void request() {this.state.handle(this);}
}

主程序(发起请求的类):

public class Main {public static void main(String[] args) throws InterruptedException {Context context = new Context();while (true) {context.request();Thread.sleep(1000);}}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

固件windows升级

升级主机驱动截图及描述补充: 由于卡上的固件需要更换版本,所以总共下载四个东西:固件、驱动、转译工具及Cli命令。(转译工具是为了解密,如果固件上有加密日志,要进行查看操作的时候) 通过命令…

《幸福》期刊杂志投稿发表

《幸福》杂志是由国家新闻出版总署批准,武汉出版社主管,武汉市妇联和武汉出版社联合主办,面向全国发行的人文社科综合期刊。办刊宗旨:宣传普及科学知识及科学方法的研究;倡导新型的人际关系,推介健康的家庭…

OC和Swift的区别,发送消息和执行方法的区别

在 Objective-C 和 Swift 中,方法调用的机制存在显著的区别,具体体现在消息传递和方法调用上。以下是关于这两种机制的详细说明: Objective-C:发送消息 消息传递机制 Objective-C 使用消息传递(Message Passing&…

go语言进阶 init() 函数

go 语言包 在一个项目中通常我们需要引入第三方包,我们来看下 当我们导入一个包的时候 发生了什么: 首先我们先详细介绍下两个函数: init(), main() 是 go 语言中的保留函数。我们可以在源码中 定义 init()函数, 此函数会在包导入…

iPhone录音的m4a格式音频文件怎么转成MP3格式?

在日常工作生活中,我们有时会用电脑或手机录音,比如iPhone录音的M4A格式音频,要上传至某些软件或者平台使用,但是有时这些平台或者软件对音频格式有要求,比如有的就只能上传mp3格式的文件。 这个时候我们就需要先将音频…

【Python Cookbook】S01E19 在字符串的开头或者结尾处做文本匹配

目录 问题解决方案讨论 问题 如果我们需要在字符串的开头或者结尾处按照指定的文本模式做检查,例如检查文件的扩展名,URL协议类型等等。 解决方案 检查如扩展名等结尾的文本模式,选择 str.startswith() 方法,检查如URL协议类型…

unity 制作表格 配置

using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName “exeConfig.asset”, menuName “Config/exeConfig”, order 3)] public class exeConfig : ScriptableObject { public string carName; [Header("表名…

基础IO(上)

前言 文件 内容 属性 所有对文件的操作就是对内容操作和对属性操作。内容是数据,属性也是数据。存储文件,必须既存储内容又存储数据。创建文件默认就是在磁盘中的。我们要访问一个文件的时候,都是要先把这个文件打开的。访问文件的本质就是…

无人机EasyDSS推拉流视频直播技术在农业植保中的精准应用与展望

随着科技的飞速发展,无人机在农业领域的应用越来越广泛,特别是在农业植保方面,无人机以其独特的优势,为农业生产带来了革命性的改变。 无人机在农业植保中的应用主要体现在两个方面:提高工作效率和精准喷洒药物。在以…

每天认识一家仪器仪表厂商 | 横河测试测量官网 - Yokogawa

横河Yokogawa工商信息: 横河测量技术(上海)有限公司于2000年08月09日成立。法定代表人山崎正晴(YAMAZAKI MASAHARU),公司经营范围包括:从事测量科技、机电科技领域内技术开发、技术转让、技术咨询、技术服务,仪器仪表、通讯设备、…

专业130+总分400+四川大学951信号与系统考研经验川大电子信息与通信工程,真题,大纲,参考书。教材。

今年四川大学951信号与系统专业课130(据我所知没有140以上的今年),总分400,顺利上岸川大,回顾一下自己这一年的复习,希望自己的经历可以对大家复习有所借鉴,也是对自己的考研画上句话。专业课&a…

全屋智能的本质是低成本的重构

全屋智能(这里指的不是每个电器都可以在APP上控制,而是基于场景化的全屋智能),我第一次去圣都总部听讲的时候是不准备做的(我的理解是这玩意儿带来的是至少十万的成本)。但随着对于装修各项事物的接触&…

使用from…import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间(namespace),并且在该命名…

性格测试.

文章目录 大五人格MBTI九型人格性格测试网站 大五人格 “大五人格"理论,也被称为"五因素模型”(Five-Factor Model, FFM)或"人格大五结构模型",是现代心理学中最为广泛接受的人格理论之一。它认为人格特质可…

爬虫案例实战

文章目录 一、窗口切换实战二、京东数据抓取 一、窗口切换实战 案例实战:使用selenium实现打开百度和腾讯两个窗口并切换 知识点:用到selenium中execute_script()执行js代码及switch_to.window()方法 全部代码如下: import time import war…

路由懒加载

在 Vue.js 中,路由懒加载(也称为代码分割)是一种优化策略,它允许你将 Vue 组件分割成不同的代码块,并在需要时按需加载它们。这有助于减少初始加载时间,提高用户体验。 Vue Router 支持 Webpack 的动态 im…

57.void指针(万能指针)

目录 一.什么是void指针 二.视频教程 一.什么是void指针 在定义变量的时候,需要用到变量的类型,变量的类型在表示在内存中的大小,而void是空,表示的是无类型。所以如果用void来定义一个变量会发生错误(无法在内存中挖…

mysql中InnoDB存储引擎的Buffer Pool

大家好。众所周知,对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是存储在磁盘上的。在处理客户端的请求时,当需要访问某个页…

思维导图——幕布

一、前言 幕布是一款专注于简化和组织信息的大纲笔记应用,它旨在帮助用户高效地整理知识点、优化工作流程以及规划个人生活。 二、软件特点 幕布工具的核心优势在于其能够快速将用户的输入转换成清晰的思维导图,便于视觉化地理解和记忆信息。 幕布还具…

插入mysql报错:Incorrect string value: ‘\xF0\xAC\x8C\x97\xE5\x9E...‘

原因分析 这个错误通常发生在使用MySQL数据库时,尝试将包含四字节UTF-8字符(通常表示为Unicode码点大于UFFFF的字符)插入到一个不支持这种字符的字符集列中。一般在插入睡眠emoji表情时容易遇到 解决 -- 设置数据库编码utf8mb4 ALTER DAT…