Java设计模式之状态模式

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。该模式将对象的行为封装在不同的状态类中,使得对象在不同的状态下可以有不同的行为,从而实现了状态的切换和行为的变化。

在状态模式中,一个对象可以有多个状态,每个状态对应一个具体的类,这些状态类共同实现一个抽象状态类或接口。对象在不同状态下的行为由当前状态类决定,对象内部维护一个指向当前状态对象的引用,通过改变状态对象的引用来改变对象的行为。

以下是状态模式的参与者:

  • Context(上下文):定义客户端感兴趣的接口,并维护一个具体状态类的实例,用于处理状态的转换。
  • State(状态):定义一个接口或抽象类,封装与Context相关的行为,并提供具体状态类的接口。
  • ConcreteState(具体状态):实现State接口或继承抽象类,定义与特定状态相关的行为。

下面是一个简单的示例,通过状态模式实现一个电梯的状态管理:

// State接口
interface ElevatorState {void open();void close();void move();void stop();
}// 具体状态类:开门状态
class OpenState implements ElevatorState {public void open() {System.out.println("电梯门已经打开");}public void close() {System.out.println("电梯门关闭");}public void move() {System.out.println("电梯开始运行");}public void stop() {System.out.println("电梯停止");}
}// 具体状态类:关门状态
class CloseState implements ElevatorState {public void open() {System.out.println("电梯门打开");}public void close() {System.out.println("电梯门已经关闭");}public void move() {System.out.println("电梯开始运行");}public void stop() {System.out.println("电梯停止");}
}// 具体状态类:运行状态
class MoveState implements ElevatorState {public void open() {System.out.println("电梯正在运行,不能打开门");}public void close() {System.out.println("电梯正在运行,不能关闭门");}public void move() {System.out.println("电梯正在运行中");}public void stop() {System.out.println("电梯停止");}
}// 具体状态类:停止状态
class StopState implements ElevatorState {public void open() {System.out.println("电梯门打开");}public void close() {System.out.println("电梯门关闭");}public void move() {System.out.println("电梯开始运行");}public void stop() {System.out.println("电梯已经停止");}
}// 上下文类:电梯
class Elevator {private ElevatorState currentState;public Elevator() {currentState = new StopState(); // 初始状态为停止状态}public void setState(ElevatorState state) {currentState = state;}public void open() {currentState.open();setState(new OpenState());}public void close() {currentState.close();setState(new CloseState());}public void move() {currentState.move();setState(new MoveState());}public void stop() {currentState.stop();setState(new StopState());}
}// 示例使用
public class StatePatternExample {public static void main(String[] args) {Elevator elevator = new Elevator();elevator.open();elevator.close();elevator.move();elevator.stop();}
}

在上述示例中,Elevator 类是上下文类,它维护了一个当前状态的引用 currentStateElevatorState 接口定义了电梯状态的行为方法,具体的状态类(如 OpenStateCloseStateMoveStateStopState)实现了这些行为方法。通过调用上下文类的方法,可以改变电梯的状态,并由当前状态类决定执行的行为。

在示例中,电梯初始状态为停止状态,依次调用 open()close()move()stop() 方法,电梯的状态和行为会相应地改变。输出结果如下:

电梯门已经打开
电梯门关闭
电梯开始运行
电梯停止

通过状态模式,我们可以将复杂的状态逻辑封装在具体状态类中,使得代码更加清晰、可扩展性更好。

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

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

相关文章

【Ascend C算子开发(入门)】——Ascend C编程模式与范式

Ascend C编程模型与范式 1.并行计算架构抽象 Ascend C编程开发的算子是运行在AI Core上的,所以我们需要了解一下AI Core的结构。AI Core主要包括计算单元、存储单元、搬运单元。 计算单元包括了三种计算资源:Scalar计算单元(执行标量计算&…

外骨骼机器人和人形机器人概览

前言:一点思考 外骨骼机器人和人形机器人都曾随着一些爆品的出现火热过一段时间,但总感觉当前技术条件还不成熟,真正能落地的应用场景不多。马斯克在擎天柱发布会上被问到人形机器人的落地与前景问题时并没有给出明确答案,只是用…

c++ pcl点云变换骨架枝干添加树叶源码实例

程序示例精选 c pcl点云变换骨架枝干添加树叶源码实例 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《c pcl点云变换骨架枝干添加树叶源码实例》编写代码,代码整洁,…

2023年9月青少年软件编程(C 语言) 等级考试试卷(七级)

青少年软件编程(C/C)7级等级考试真题试卷(2023年9月) 编程题第 1 题 红与黑(2023.9) 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上&#xff0c…

自然语言处理---Tr ansformer机制详解之Transformer结构

1 Encoder模块 1.1 Encoder模块的结构和作用 经典的Transformer结构中的Encoder模块包含6个Encoder Block.每个Encoder Block包含一个多头自注意力层,和一个前馈全连接层. 1.2 Encoder Block 在Transformer架构中,6个一模一样的Encoder …

Vue Router 刷新当前页面

Vue项目, 在实际工作中, 有些时候需要在 加载完某些数据之后对当前页面进行刷新, 以期 onMounted 等生命周期函数, 或者 数据重新加载. 总之是期望页面可以重新加载一次. 目前总结有三种途径可实现以上需求: 一, reload 直接刷新页面 window.location.reload(); $router.go(…

My Code Style

受到 _slb 大佬的启发,~~(趁着集训休假开摆)~~也打算写一篇关于自己码风的文章 QwQ。 自认为自己码风很好 头文件 万能头忠实拥护者,纵使它在变量名上虐我千百遍,我仍然要坚定地使用它! 变量 数组一律…

【JavaScript】深入浅出理解事件循环

1. 浏览器的进程模型 1.1 进程 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 1.2 线程 有了进程后,就可以运…

【广州华锐互动】VR营销心理学情景模拟培训系统介绍

在高度竞争的汽车市场中,销售人员需要具备强大的专业知识、引人入胜的销售技巧,以及敏锐的市场洞察力。然而,传统的培训方式往往无法满足这些需求,因为它们往往忽略了实践的重要性。 为了解决这个问题,许多公司开始采用…

老卫带你学---leetcode刷题(215. 数组中的第K个最大元素)

215. 数组中的第K个最大元素 问题: 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解…

TCP/IP(十九)TCP 实战抓包分析(三)TCP 第一次握手 SYN 丢包

一 TCP 三次握手异常情况实战分析 说明: 本文是TCP 三次握手异常系列之一 ① 异常场景 接下里我用三个实验案例,带大家一起探究探究这三种异常关注: 如何刻意练习模拟上述场景 以及 wireshark现象 ② 实验环境 ③ 实验一:TCP 第一次握…

Python —— UI自动化之使用JavaScript进行元素点亮、修改、点击元素

1、JavaScript点亮元素 在控制台通过JavaScript语言中对元素点亮效果如下: 将这个语句和UI自动化结合,代码如下: locator (By.ID,"kw") # 是元组类型 web_element WebDriverWait(driver,5,0.5).until(EC.visibility_of_eleme…

Arduino驱动BMA220三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 BMA220的三轴加速度计是一款具有I2C接口的超小型三轴低g加速度传感器断路器,面向低功耗消费市场应用。它可以测量3个垂直轴的加速度,从而在手机、手持设备、计算机外围设备、人机界面、虚拟现实功能和游戏控制器中感知倾斜、…

利用CSRF或XSS攻击网站的例子

利用 CSRF 攻击网站的简单示例&#xff1a; 假设有一个在线银行应用&#xff0c;用户可以在其中执行转账操作。用户登录后&#xff0c;系统会生成一个包含转账信息的表单&#xff0c;用户需要填写表单来发起转账。这个表单如下所示&#xff1a; <form action"https:/…

Python数据分析之numpy的使用

作者将自己学习numpy的代码笔记分享一下&#xff0c;想学哪一部分就把哪一部分的注释去掉即可&#xff0c;便于初学者学习和复习&#xff1a; import numpy as np主要是根据数据构建算法可能用到的矩阵&#xff0c;对于矩阵可以进行相应的处理变换#将一个列表输出成一维向量&a…

王道计算机考研 操作系统学习笔记 + 完整思维导图篇章五: IO管理

目录 IO设备的基本概念和分类 IO设备的分类 按使用特性分类 按传输速率分类 按信息交换单位分类 IO控制器 l/O设备的电子部件&#xff08;I/O控制器&#xff09; l/O控制器的组成 内存映像I/o vs.寄存器独立编址 IO控制方式 程序直接控制方式 中断驱动方式 DMA方式 ​编辑通…

java1.8流的新特性使用

案例描述 今天跟着黑马程序员的视频&#xff0c;完成“瑞吉外卖”项目的菜品信息管理模块的时候&#xff0c;遇到了一个比较陌生的写法 用到了Java8的新特性 stream().map((item) -> {}).collect() List<DishDto> collect records.stream().map((item) -> {DishDt…

Linux网络编程杂谈(聊聊网络编程背后的故事)

数据是如何传输到物理网络上的&#xff1f; 以TCP为例&#xff0c;当 TCP 决定发送数据时&#xff0c;这些数据需要经过多个处理阶段才能真正被传输到物理网络。其中一个关键步骤是将数据移动到网络接口卡 (NIC)。以下是这个过程的详细描述&#xff1a; 数据序列化: TCP 会为要…

10.17七段数码管单个多个(部分)

单个数码管的实现 第一种方式 一端并接称为位码&#xff1b;一端分别接收电平信号以控制灯的亮灭&#xff0c;称为段码 8421BCD码转七段数码管段码是将BCD码表示的十进制数转换成七段LED数码管的7个驱动段码&#xff0c; 段码就是LED灯的信号 a为1表示没用到a&#xff0c;a为…

文件读取结束的判定

大家好啊&#xff0c;我们今天来补充文件操作的读取结束的判定。 被错误使用的feof 牢记&#xff1a;在文件读取过程中&#xff0c;不能用feof函数的返回值直接用来判断文件的是否结束而是应用于当文件读取结束的时候&#xff0c;判断是读取失败结束&#xff0c;还是遇到文件尾…