设计模式23——状态模式

news2024/11/23 3:00:18

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的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 {
    @Override
    public void handle(Context context) {
        System.out.println("状态A");
        context.setState(new ConcreteStateB());//这里也可以条件语句判断下一个状态是谁
    }
}

状态B:

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

状态C:

public class ConcreteStateC extends State {
    @Override
    public 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.coloradmin.cn/o/1718761.html

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

相关文章

打造高效上传体验:基于Kotlin的Android快速上传框架

1. 引言 在Android开发中,文件上传操作常常面临各种挑战,为此我开源了一个高效、易用的快速上传框架,助力开发者轻松实现文件上传功能。 GitHub项目地址: 点我 2. 框架特点概述 纯Kotlin编写:简洁、现代的编程语言。MVVM架构&a…

动态分配函数参数用二级指针的作用

文章目录 前言一、案例 前言 在一些情况下,我们需要在函数内部动态地分配内存来存储结构体,并且需要在函数外部访问该结构体。在这种情况下,可以使用二级指针作为函数参数来实现动态内存分配,并且在函数外部使用指针访问结构体。…

py黑帽子学习笔记_web攻击

python网络库 py2的urllib2 py3好像把urllib2继承到了标准库urllib,直接用urllib就行,urllib2在urllib里都有对应的接口 py3的urllib get请求 post请求,和get不同的是,先把post请求数据和请求封装到request对象,再…

数字化转型对企业来说意味着什么?

数字化转型是当今社会不可避免的趋势,它的发展其实是多方面因素影响导致的。首先,随着科技的迅速发展,人们对于信息获取和处理的需求越来越强烈,这促使了各行各业都要朝着数字化方向发展。其次,全球化的潮流让企业需要…

制作U启动装win10系统

一、背景 在我们日常上班过程中经常会遇到以下问题: 1、c盘快满了 2、新电脑用着好卡 3、买新电脑不会装系统 二、实现方式 通常我们遇到这种情况 都会选择去电脑专卖店找专人装系统 但是这样又需要花费自己的money,这样显得自己不够专业像个菜鸟&#…

【成品设计】基于STM32单片机的语音远程运算器

《基于STM32单片机的语音远程运算器》 输入端 所需器件: STM32最小系统板。语音识别模块:用于检测语音命令。蓝牙模块:作为主机用于与输出端蓝牙模块进行连接,发送数据。蜂鸣器红色LED:用于语音命令检测错误提示。 …

记录一次云服务器无法连接的排查过程

运行环境:阿里云服务器 故障外显原因:登录失败,操作系统禁用了密码登录方式 控制台监控数据显示云盘读写BPS拉满了 因为之前问过线上售后,让安装了atop监控,,所以先打开atop日志: atop -r /var/log/atop…

揭秘数字货币:比特币背后的技术逻辑

随着科技的飞速发展,数字货币作为一种新兴的经济形态,已经逐渐走入我们的视野。其中,比特币无疑是这一领域的佼佼者。那么,比特币背后的技术逻辑究竟是什么呢?本文将为您揭开这一神秘面纱。 一、区块链技术:比特币的基石 比特币的核心技术就是区块链(Blockchain)。区块…

[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录 0.子序列 vs 子数组1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.摆动序列1.题目链接2.题目链接3.代码实现 0.子序列 vs 子数组 子序列: 相对顺序是跟源字符串/数组是一致的但是元素和元素之间,在源字符串/数组中可以是不连续的一般时间…

前端开发:$nextTick()的使用及原理

目录 前言 $nextTick()的概念 $nextTick()的用法和原理 1、$nextTick()用法 2、$nextTick()原理 $nextTick()的具体使用示例 拓展:面试中考察$nextTick()的底层原理 最后 前言 在前端开发中,涉及到JS原生的使用原理是非常重要的知识点&#xff0…

Spring Boot详解:深入了解与实践

文章目录 1. Spring Boot简介1.1 什么是Spring Boot?1.2 Spring Boot的历史背景1.3 Spring Boot的核心特点 2. Spring Boot的核心概念2.1 自动配置2.1.1 自动配置原理2.1.2 自定义配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模块3.1…

Microsoft Dynamics 365 Business Central 讲解VAT RATE CHANGE TOOL(增值税税率更改工具)

学习目标: 如果使用VAT RATE CHANGE TOOL(增值税税率更改工具) 过程演示: 1.创建新的VAT产品过账组 2.创建新的总账科目以过账采购、销售和逆向征收增值税。 3.给新的VAT产品过账设置过账设置 4.创建一个新的一般产品过账组 5…

百度地图1

地图的基本操作 百度地图3.0文档 百度地图3.0实例中心 设置地图 centerAndZoom(center: Point, zoom: Number)设初始化地图,center类型为Point时,zoom必须赋值,范围3-19级, // 百度地图API功能var map new BMap.Map("map"); //…

element-plus关于表单数据自定义参数校验

element-plus关于表单数据自定义参数校验 核心点&#xff1a; 代码&#xff1a; <el-form-item :prop"tableData[ scope.$index ].score":rules"[{ required: true, message: 得分不能为空, trigger: blur },{ validator: (rule: any, value: any, ca…

2024最新群智能优化算法:大甘蔗鼠算法(Greater Cane Rat Algorithm,GCRA)求解23个函数,提供MATLAB代码

一、大甘蔗鼠算法 大甘蔗鼠算法&#xff08;Greater Cane Rat Algorithm&#xff0c;GCRA&#xff09;由Jeffrey O. Agushaka等人于2024年提出&#xff0c;该算法模拟大甘蔗鼠的智能觅食行为。 参考文献 [1]Agushaka J O, Ezugwu A E, Saha A K, et al. Greater Cane Rat Alg…

Whisper-AT:抗噪语音识别模型(Whisper)实现通用音频事件标记(Audio Tagger)

本文介绍一个统一音频标记&#xff08;Audio Tagger&#xff09;和语音识别&#xff08;ASR&#xff09;的模型&#xff1a;Whisper-AT&#xff0c;通过冻结Whisper的主干&#xff0c;并在其之上训练一个轻量级的音频标记模型。Whisper-AT在额外计算成本不到1%的情况下&#xf…

MySQL 命令总结篇-思维导图

一些常用命令以思维导图形式总结在这里了&#xff0c;掌握这些进行MySQL基本操作绝对没问题&#xff0c;加油&#xff01;友友们可以根据这些思维导图进行知识总结。 目录 一、快速上手 二、SQL 语句分类&#xff08;DDL、DML、DQL、DCL&#xff09; 三、数据类型 四、约束…

图书管理系统——Java实现

文章目录 Java实现图书管理系统问题分析框架搭建业务实现项目测试代码演示BookioperationUserMain&#xff08;默认包&#xff09; Java实现图书管理系统 学习了前六篇的SE语法&#xff0c;我们现在要用它们实现一个简单的图书管理系统项目&#xff0c;深入了解各个知识点的应…

阿里云CDN流量被盗刷或CC攻击会怎么样?

最近&#xff0c;一位使用了阿里云CDN的站长向主机吧反应&#xff0c;其域名使用的阿里云CDN不知道是因为被盗刷还是被CC攻击&#xff0c;导致不仅原本帐号上的3T流量包用完了&#xff0c;连帐户也欠了几百元的流量费。 而产生这么多流量的只是晚上睡一觉起来&#xff0c;手机…

SpringCloud如何实现SSO单点登录?

目录 一、SpringCloud框架介绍 二、什么是SSO单点登录 三、单点登录的必要性 四、SpringCloud如何实现SSO单点登录 一、SpringCloud框架介绍 Spring Cloud是一个基于Spring Boot的微服务架构开发工具集&#xff0c;它整合了多种微服务解决方案&#xff0c;如服务发现、配置…