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

状态模式

状态(State)模式属于行为型模式的一种。

状态模式允许对象在其内部状态改变时改变其行为,使其看上去就像改变了自身所属的类一样。

状态模式是为了把一大串if...else...的逻辑给分拆到不同的状态类中,使得将来增加状态比较容易。

状态模式的关键设计思想在于状态切换。简单的状态转换可以直接由调用方指定,复杂的状态转换可以在内部根据条件触发完成。

状态模式建议为对象的所有可能状态新建一个类,然后将所有状态的对应行为抽取到这些类中。

当对象的行为依赖于其状态,并且状态之间的转换复杂时;当代码中存在大量的条件语句,并且这些条件语句依赖于对象的状态时,我们都可以使用状态模式。

状态模式通常有以下组成部分:

  • 抽象状态接口:声明一个或多个方法,用于封装具体状态的行为。
  • 具体状态类:实现抽象状态接口,根据不同的状态实现具体的行为。
  • 环境类:包含一个状态对象的引用,并在状态改变时更新其行为。

我们实现一个简单的状态模式。

1、抽象状态类

// 抽象状态类
public interface State {void handle(Context context);
}

2、具体状态类

// 具体状态类A
public class ConcreteStateA implements State {@Overridepublic void handle(Context context) {System.out.println("Handling request in State A.");context.setState(new ConcreteStateB());}
}// 具体状态类B
public class ConcreteStateB implements State {@Overridepublic void handle(Context context) {System.out.println("Handling request in State B.");context.setState(new ConcreteStateA());}
}

3、环境类

// 环境类
public class Context {private State state;public Context(State state) {this.state = state;}public void setState(State state) {this.state = state;}public void request() {state.handle(this);}
}

4、客户端

// 客户端代码
public class StatePatternDemo {public static void main(String[] args) {Context context = new Context(new ConcreteStateA());context.request(); // 输出: Handling request in State A.context.request(); // 输出: Handling request in State B.}
}

状态模式的优缺点。 

优点:

  • 封装状态转换:将状态转换逻辑封装在状态对象内部,避免了复杂的条件判断语句。
  • 易于扩展:增加新的状态类不会影响现有代码,符合开闭原则。
  • 集中状态相关行为:将所有与特定状态相关的行为集中到一个类中,增强了代码的可维护性。

缺点:

  • 增加类和对象数量:每个状态都需要一个具体的状态类,可能导致类的数量增加。
  • 实现复杂:模式结构和实现相对复杂,可能增加系统的复杂度。

状态模式通过将状态和行为封装在独立的类中,使得对象的行为随着状态的变化而变化,增强了系统的灵活性和可维护性。

状态模式跟策略模式很相似,但有一个关键性的不同点——在状态模式中,特定状态是知道其他所有状态的存在的,且能触发从一个状态到另一个状态的转换;而策略则几乎是完全不知道其他策略的存在的。

他人犯错,常有己过。-- 烟沙九洲

相关文章:

状态模式

状态(State)模式属于行为型模式的一种。 状态模式允许对象在其内部状态改变时改变其行为,使其看上去就像改变了自身所属的类一样。 状态模式是为了把一大串if...else...的逻辑给分拆到不同的状态类中,使得将来增加状态比较容易。…...

C++ | 面向对象 | 类

👻类 👾语法格式 class className{Access specifiers: // 访问权限DataType variable; // 变量returnType functions() { } // 方法 };👾访问权限 class className {public:// 公有成员protected:// 受保护成员private:// 私有成员 }…...

鸿蒙-AVPlayer

compileVersion 5.0.2(14) 音频播放 import media from ohos.multimedia.media; import common from ohos.app.ability.common; import { BusinessError } from ohos.base;Entry Component struct AudioPlayer {private avPlayer: media.AVPlayer | nu…...

Android移动应用开发实践-1-下载安装和简单使用Android Studio 3.5.2版本(频频出错)

一、下载安装 1.Android Studio3.5.2下载地址:Android Studio3.5.2下载地址 其他版本下载地址:其他版本下载地址 2.安装教程(可以多找几个看看) 安装 | 手把手教你Android studio 3.5.2安装(安装教程)_a…...

从.m3u8到.mp4:使用批处理脚本完成视频处理的完整指南

这里介绍一个Windows批处理脚本(Windows Batch Script),主要用于处理 .m3u8 ts 视频文件的下载和合并功能。 以下是程序的主要功能和逻辑流程: 功能概述 参数检查与路径处理: 检查是否传递了文件或文件夹路径作为参数…...

qt5的中文乱码问题,QString、QStringLiteral 为 UTF-16 编码

qt5的中文乱码问题一直没有很明确的处理方案。 今天处理进程间通信时,也遇到了qt5乱码问题,一边是设置的GBK,一边设置的是UTF8,单向通信约定采用UTF8。 发送端保证发的是UTF8字符串,因为UTF8在网络数据包中没有字节序…...

Gurobi 并行计算的一些问题

最近尝试用 gurobi 进行并行计算,即同时用多个 cpu 核计算 gurobi 的 model,但是发现了不少问题。总体来看,gurobi 对并行计算的支持并不是那么好。 gurobi 官方对于并行计算的使用在这个网址,并有下面的大致代码: i…...

Vue3 中如何实现响应式系统中的依赖收集和更新队列的解耦?

一、问题解析:为什么需要解耦? 在响应式系统中,依赖收集​(追踪数据与视图的关联关系)和更新队列​(批量处理数据变化带来的副作用)是两个核心但职责不同的模块。 Vue3 通过以下设计实现解耦&…...

vue项目中动态添加类名样式不生效问题

一、问题描述 在vue项目中使用:class{tableContent: summary}给元素动态添加了类名tableContent&#xff0c;运行代码后查看类名已经添加成功但样式并未生效。 二、问题产生原因并解决 刚开始把样式写在了<style lang"scss" scoped></style>中&#x…...

供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面、会员 UI 设计图(一)

供应链管理系统--升鲜宝门店收银系统功能解析&#xff0c;登录、主界面 会员 UI 设计图&#xff08;一&#xff09;...

用AI写游戏3——deepseek实现kotlin android studio greedy snake game 贪吃蛇游戏

项目下载 https://download.csdn.net/download/AnalogElectronic/90421306 项目结构 就是通过android studio 建空项目&#xff0c;改下MainActivity.kt的内容就完事了 ctrlshiftalts 看项目结构如下 核心代码 MainActivity.kt package com.example.snakegame1// MainA…...

设计模式的引入

面向对象设计原则 1. 软件设计固有的复杂性2. 面向对象设计原则2.1 引入2.2 依赖倒置原则2.3 开放封闭原则2.4 单一职责原则2.5 Liskov 替换原则&#xff08; LSP&#xff09;2.6 接口隔离原则&#xff08; ISP&#xff09;2.7 优先使用对象组合&#xff0c;而不是类继承2.8 封…...

P8697 [蓝桥杯 2019 国 C] 最长子序列

P8697 [蓝桥杯 2019 国 C] 最长子序列 题目 分析代码 题目 分析 先分析一波xdm 题意呢就是在s中找有多少个能和t匹配的字符&#xff0c;注意&#xff1a;连续匹配&#xff0c;输出连续的次数 欧克&#xff0c;开始分析&#xff0c;首先&#xff0c;哎~字母&#xff01;还强调…...

基于阿里云PAI平台快速部署DeepSeek大模型实战指南

一、DeepSeek大模型&#xff1a;企业级AI应用的新标杆 1.1 为什么选择DeepSeek&#xff1f; 近期&#xff0c;DeepSeek系列模型凭借其接近GPT-4的性能和开源策略&#xff0c;成为全球开发者关注的焦点。在多项国际评测中&#xff0c;DeepSeek-R1模型在推理能力、多语言支持和…...

【java进阶】java多态深入探讨

前言 在Java的编程宇宙中,多态是极为关键的概念,它宛如一条灵动的纽带,串联起面向对象编程的诸多特性,赋予程序宛如生命般的动态活力与高度灵活性。透彻理解多态,不仅是提升代码质量的关键,更是开启高效编程大门的钥匙。 一、多态的定义与本质 多态,从概念层面来讲,…...

蓝桥杯备赛-拔河

问题描述 小明是学校里的一名老师&#xff0c;他带的班级共有 nn 名同学&#xff0c;第 ii 名同学力量值为 aiai​。在闲暇之余&#xff0c;小明决定在班级里组织一场拔河比赛。 为了保证比赛的双方实力尽可能相近&#xff0c;需要在这 nn 名同学中挑选出两个队伍&#xff0c…...

Zookeeper(67) Zookeeper在HBase中的应用是什么?

Zookeeper 在 HBase 中起到了至关重要的作用&#xff0c;主要用于协调和管理 HBase 集群中的多个组件。具体来说&#xff0c;Zookeeper 在 HBase 中的应用包括以下几个方面&#xff1a; Master 选举&#xff1a;HBase 集群中可以有多个 Master 节点&#xff0c;但只有一个处于…...

java后端开发day20--面向对象进阶(一)--static继承

&#xff08;以下内容全部来自上述课程&#xff09; 1.static–静态–共享 static表示静态&#xff0c;是java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 1.静态变量 被static修饰的成员变量&#xff0c;叫做静态变量。 特点&#xff1a; 被该类…...

IDEA使用Maven方式构建SpringBoot项目

1、环境准备 确保你已经安装了以下工具&#xff1a; Java JDK&#xff08;推荐 JDK 8 或更高版本&#xff09; IntelliJ IDEA&#xff08;推荐使用最新版本&#xff09; 2、创建 Spring Boot 项目 &#xff08;1&#xff09; 打开 IntelliJ IDEA。 &#xff08;2&#xff09…...

Spring Boot2.0之十 使用自定义注解、Json序列化器实现自动转换字典类型字段

前言 项目中经常需要后端将字典类型字段值的中文名称返回给前端。通过sql中关联字典表或者自定义函数不仅影响性能还不能使用mybatisplus自带的查询方法&#xff0c;所以推荐使用自定义注解、Json序列化器&#xff0c;Spring的缓存功能实现自动转换字典类型字段。以下实现Spri…...

C#问题解决方案 --- 生成软件hash,生成文件hash

生成软件hash值&#xff1a; private string GetEXEHashString() {//获得软件哈希值Process currProcess Process.GetCurrentProcess();string filePath currProcess.MainModule.FileName;string hashEXE string.Empty;using (FileStream fs new FileStream(filePath, Fil…...

云计算如何解决延迟问题?

在云计算中&#xff0c;延迟&#xff08;latency&#xff09;指的是从请求发出到收到响应之间的时间间隔。延迟过高可能会严重影响用户体验&#xff0c;特别是在需要实时响应的应用中&#xff0c;如在线游戏、视频流、金融交易等。云计算服务如何解决延迟问题&#xff0c;通常依…...

多模态人物视频驱动技术回顾与业务应用

一种新的商品表现形态&#xff0c;内容几乎存在于手淘用户动线全流程&#xff0c;例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力&#xff0c;能够从供给端缓解内容生产成本高的问题&#xff0c;通过源源不断的低成本供给倒推…...

鸿蒙中连接手机可能遇到的问题

连接权限问题&#xff1a;手机开启了严格的权限管理机制&#xff0c;若未授予鸿蒙设备连接所需的权限&#xff0c;如蓝牙连接时未开启蓝牙权限&#xff0c;或者 USB 连接时未允许设备进行调试、文件传输等操作&#xff0c;就会导致连接失败。例如&#xff0c;当使用鸿蒙平板通过…...

15.代码随想录算法训练营第十五天|(递归)110. 平衡二叉树,257. 二叉树的所有路径*,404. 左叶子之和,222.完全二叉树的节点个数[打卡自用]

15.代码随想录算法训练营第十五天|&#xff08;递归&#xff09;110. 平衡二叉树&#xff0c;257. 二叉树的所有路径*&#xff0c;404. 左叶子之和&#xff0c;222.完全二叉树的节点个数 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xf…...

H5 火柴人科目三和GitHub获取仓库点星星的用户列表发生了艺术的碰撞

先看效果&#xff0c;代码写的比较乱&#xff0c;有待优化 效果 https://linyisonger.github.io/H5.Examples/?name./089.%E7%9C%8B%E6%98%9F%E6%98%9F%E7%9A%84%E8%88%9E%E8%80%85.html 思路 看起来很简单&#xff0c;实则也不是很难&#xff0c;就是需要思路要打开。 一…...

使用消息队列怎样防止消息重复?

大家好&#xff0c;我是君哥。 使用消息队列时&#xff0c;我们经常会遇到一个可能对业务产生影响的问题&#xff0c;消息重复。在订单、扣款、对账等对幂等有要求的场景&#xff0c;消息重复的问题必须解决。 那怎样应对重复消息呢&#xff1f;今天来聊一聊这个话题。 1.三…...

06.【C++】模板初阶(template<typename T>,充分复用函数,函数模板和类模板的使用)

目录 一. 泛型编程 二. 函数模板&#xff08;template的使用&#xff09; 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 三. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 一. 泛型编程 如何实现一个通用…...

深入理解 并查集LRUCaChe

并查集&LRUCaChe 个人主页&#xff1a;顾漂亮 文章专栏&#xff1a;Java数据结构 1.并查集的原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后根据一定规律将归于同一组元素的…...

在 macOS 系统上安装 kubectl

在 macOS 系统上安装 kubectl 官网&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-macos/ 用 Homebrew 在 macOS 系统上安装 如果你是 macOS 系统&#xff0c;且用的是 Homebrew 包管理工具&#xff0c; 则可以用 Homebrew 安装 kubectl。 运行…...

如何设置HTTPOnly和Secure Cookie标志?

设置HttpOnly和Secure标志于Cookie中是增强Web应用安全性的重要措施。这两个标志帮助防止跨站脚本攻击&#xff08;XSS&#xff09;和中间人攻击&#xff08;MitM&#xff09;。下面是关于如何设置这些标志的具体步骤&#xff1a; 设置方法 在服务器端设置 根据你的服务器端…...

seacmsv9注入管理员账号密码+orderby+limi

1&#xff1a;mysql默认存储引擎innoDB携带的表 1&#xff0c;mysql.innodb_table_stats 2,mysql.innodb_index_stats SELECT table_name FROM mysql.innodb_table_stats WHERE database_name DATABASE(); 2&#xff1a; 关键字做处理 HEX编码:0x696E666F726D6174696F6E5F7…...

Orange 开源项目 - 集成百度智能云-千帆大模型

1 集成百度智能云-千帆大模型 百度智能云-千帆ModelBuilder百度智能云千帆大模型服务与开发平台ModelBuilder&#xff08;以下简称千帆ModelBuilder&#xff09;是面向企业开发者的一站式大模型开发及服务运行平台。千帆ModelBuilder不仅提供了包括文心一言底层模型和第三方开源…...

mac 安装Eclipse,汉化及安装ERMaster

1、下载Eclipse 进入官网直接下载 https://www.eclipse.org/downloads/ 2、Eclipse 汉化 以下是 Eclipse 2024-12 汉化的具体方法&#xff1a; 1、打开安装新软件界面&#xff1a;打开 Eclipse&#xff0c;点击菜单栏中的 “Help”&#xff0c;选择 “Install New Software……...

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…...

Unity3D 战斗系统架构与设计详解

引言 战斗系统是许多游戏的核心玩法之一&#xff0c;尤其是在动作游戏、角色扮演游戏&#xff08;RPG&#xff09;和策略游戏中。Unity3D 作为一款强大的游戏引擎&#xff0c;提供了丰富的工具和 API 来帮助开发者实现复杂的战斗系统。本文将详细探讨 Unity3D 中战斗系统的架构…...

Apache Commons Chain 与 Spring Boot 整合:构建用户注册处理链

文章目录 概述1. 环境准备2. 创建自定义上下文3. 创建命令验证用户输入保存用户数据发送欢迎邮件 4. 构建并执行处理链5. 使用处理链6. 运行结果7. 总结 概述 本文档旨在展示如何在 Spring Boot 应用中使用 Apache Commons Chain 来实现一个用户注册的处理链。我们将通过 Chai…...

数据结构:二叉树的数组结构以及堆的实现详解

目录 一.树与二叉树 1.树的概念与相关术语&#xff1a; 2.二叉树&#xff1a; &#xff08;1&#xff09;定义&#xff1a; &#xff08;2&#xff09;特殊的二叉树&#xff1a; &#xff08;3&#xff09;完全二叉树 &#xff08;4&#xff09;二叉树的存储结构&#x…...

机器学习01

机器学习的基本过程如下&#xff1a; 1.数据获取 2.数据划分 3.特征提取 4.模型选择与训练 5.模型评估 6.模型调优 一、特征工程&#xff08;重点&#xff09; 0. 特征工程步骤为&#xff1a; 特征提取(如果不是像dataframe那样的数据&#xff0c;要进行特征提取&#…...

常见锁类型介绍

下面结合代码详细介绍 Mutex、RW Lock、Futex、自旋锁、信号量、条件变量 和 synchronized&#xff0c;并分析它们的适用场景、特点以及为什么这些锁适用于特定场景。我们将从锁的实现机制和性能特点出发&#xff0c;解释其适用性。 1. Mutex&#xff08;互斥锁&#xff09; 代…...

[uboot][stm32]配置LTDC屏幕

文章目录 前提dts设备树修改Kconfig日志打印后记 https://github.com/wdfk-prog/u-boot 前提 手上刚好有块屏幕,尝试在uboot中点亮一下使用前请使用其他手段点亮该屏幕确保屏幕的完好再进行操作.确保配置的参数及引脚是可用的. dts设备树修改 ltdc状态修改为重定向前绑定,另…...

nodejs用ws模块反向代理socks5数据,即用ws写服务端和客户端及加密

首先思路是客户端发送socks5请求数据——>服务端解密并解析socks5数据是否为真&#xff0c;解析出Host和port,并用net.socket访问目标网站&#xff0c;目标网站返回数据&#xff0c;服务端再用ws发送返回数据给客户端 //解析socks5数据和返回socks5格式响应 //在读下面代码…...

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…...

linux后台运行程序怎么停止

启动 nohup ./jmeter -nt test.jmx 查看 ps -ef | grep nohup或者 ps -ef | grep test 停止 kill 掉上面查询出的进程 疑惑 停止掉java进程或者jmeter进程&#xff0c;但是没有实际停止任务&#xff0c;所以用nohup查出来进程再停止比较靠谱&#xff01;&#xff01;...

华为认证考试证书下载步骤(纸质+电子版)

华为考试证书可以通过官方渠道下载相应的电子证书&#xff0c;部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下&#xff1a; ①访问华为培训与认证网站 打开浏览器&#xff0c;登录华为培训与认证官方网站 ②登录个人账号 在网站首页&#xff0c;点…...

scala基础

Scala基础 scala基础Scala介绍第一个scala代码object和class的区别关键区别伴生类和伴生对象&#xff1a; 字节码解析在java中创建三个类 反编译代码编译User.class源码后的结果编译Emp.class源码后的结果 注释Scala类型推断&至简原则变量var和val之间的区别可变变量不可变…...

Linux中的查看命令

路径分为相对路径&#xff08;行相对当前工作目录开始的路径&#xff09;和绝对路径&#xff08;不管是&#xff09;#&#xff1a;命令提示符&#xff0c;从这个位置可以开始输入命令&#xff0c;另一个提示符为$&#xff0c;如果是root&#xff0c;则提示为#&#xff1b;如果是…...

深入了解 NAT 模式:网络地址转换的奥秘

深入了解 NAT 模式&#xff1a;网络地址转换的奥秘 在计算机网络的世界里&#xff0c;NAT 模式&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;扮演着至关重要的角色。它就像是网络中的翻译官&#xff0c;在不同网络地址之间进行转换&#xff0…...

HTML第二节

一.列表 1.列表的简介 2.无序列表 注&#xff1a;1.ul里面只能放li&#xff0c;不能放标题和段落标签 2.li里面可以放标题和段落等内容 3.有序列表 4.定义列表 注&#xff1a;要实现上图的效果需要CSS 二.表格 1.表格介绍 注&#xff1a;1.th有额外的效果&#xff0c;可以…...

203、【数组】NLP分词实现(Python)

题目描述 给定一个词典&#xff0c;比如[“杭州”,“西湖”,“博物馆”,“杭州西湖博物馆”,“我”]​ 对于输入的文本进分词&#xff1a;我在杭州的杭州西湖博物馆玩了一天​ 分词结果处理为如下形式的字符串: 我\W 在 杭州\W 的 杭州西湖博物馆\W 玩了一天​ 对于输入的文本…...