设计模式:生活中的状态模式

devtools/2024/9/24 6:25:39/

让我们通过一个生活中的例子来深入理解状态模式:咖啡机的工作流程。想象一下,一个咖啡机有几种状态:无币状态、有币状态、制作咖啡状态和咖啡制作完成·状态。用户在每个状态下与咖啡机的互动都是不同的。

状态模式在咖啡机中的应用

  1. 无币状态:用户可以投币,咖啡机随后进入有币状态。
  2. 有币状态:用户可以选择退币,回到无币状态,或者按下制作按钮,咖啡机进入制作咖啡状态。
  3. 制作咖啡状态:咖啡机开始制作咖啡,完成后进入咖啡制作完成状态。
  4. 咖啡制作完成状态:用户取走咖啡,咖啡机回到无币状态。

示例代码

首先,定义咖啡机的状态接口:

interface CoffeeMachineState {void insertCoin();void pressButton();void takeCoffee();void refundCoin();
}

然后,实现各个状态:

// 无币状态
class NoCoinState implements CoffeeMachineState {private CoffeeMachine machine;public NoCoinState(CoffeeMachine machine) {this.machine = machine;}public void insertCoin() {System.out.println("投币成功");machine.setState(machine.getHasCoinState());}public void pressButton() {System.out.println("请先投币");}public void takeCoffee() {System.out.println("请先投币");}public void refundCoin() {System.out.println("您还没有投币");}
}// 有币状态
class HasCoinState implements CoffeeMachineState {private CoffeeMachine machine;public HasCoinState(CoffeeMachine machine) {this.machine = machine;}public void insertCoin() {System.out.println("您已经投过币了");}public void pressButton() {System.out.println("咖啡制作中");machine.setState(machine.getCoffeeMakingState());}public void takeCoffee() {System.out.println("咖啡还未制作完成");}public void refundCoin() {System.out.println("退币成功");machine.setState(machine.getNoCoinState());}
}// 添加制作咖啡状态和咖啡制作完成状态代码...

接下来,实现咖啡机上下文:

class CoffeeMachine {private CoffeeMachineState noCoinState;private CoffeeMachineState hasCoinState;private CoffeeMachineState coffeeMakingState;private CoffeeMachineState coffeeReadyState;private CoffeeMachineState currentState;public CoffeeMachine() {noCoinState = new NoCoinState(this);hasCoinState = new HasCoinState(this);coffeeMakingState = new CoffeeMakingState(this);coffeeReadyState = new CoffeeReadyState(this);currentState = noCoinState; // 初始状态为无币状态}public void setState(CoffeeMachineState state) {this.currentState = state;}public void insertCoin() {currentState.insertCoin();}public void pressButton() {currentState.pressButton();}public void takeCoffee() {currentState.takeCoffee();}public void refundCoin() {currentState.refundCoin();}// 省略getter方法...
}

通过上述代码,我们可以看到状态模式如何在咖啡机中被应用。状态模式使得咖啡机的状态转换逻辑变得清晰,每个状态的行为封装在各自的类中,易于理解和扩展。

总结

状态模式通过将状态的变化逻辑分散到不同的状态对象中,而非集中在一个大的条件语句里,使得代码更加模块化,易于理解和维护。这种模式非常适用于对象的行为依赖于其状态的场景,如咖啡机示例所示,它帮助我们清晰地模拟和管理了咖啡机在不同状态下的行为。


http://www.ppmy.cn/devtools/9602.html

相关文章

ElasticSearch:查询操作合集

先看下我的数据: 1、查询所有文档: GET /cartest/_search或者 GET /cartest/_search {"query": {"match_all": {}} }2、匹配查询: match匹配类型查询,会把查询条件进行分词,然后进行查询&…

Web3钱包开发获取测试币-Base Sepolia(二)

Web3钱包开发获取测试币-Base Sepolia(二) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b0c0ac86b04a496087471388532bc54a.png) 基于上篇 Web3钱包开发获取测试币-Polygon Mumbai(一) :https://suwu150.blog.csdn.net/article/details/137949473 我…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用CFMIME Encoder方法进行图像压缩保存(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用CFMIME Encoder方法进行图像压缩保存(C) Baumer工业相机Baumer工业相机通过NEOSDK进行图像压缩的技术背景代码分析第一步:先引用对应的NET框架的DLL文件第二步:在回调函数里进行…

spi 收发流程

patch日期 收发流程的重大修改,来源于2012年的如下补丁 内核提交收发流程的patch spi: create a message queueing infrastructure - kernel/git/stable/linux.git - Linux kernel stable tree 源代码路径及功能 源码作用\drivers\spi\spi.cspi 通用接口&#x…

YOLOv8 测试 5-2:Linux 中 Dockerfile 部署 YOLOv8 项目一键运行,Python 封装 API 接口测试

一、前言 记录时间 [2024-4-15] 系列文章简摘: Docker 学习笔记(二):在 Linux 中部署 Docker(Centos7 下安装 docker、环境配置,以及镜像简单使用) API 接口简单使用(二)…

前端js控制元素移动

背景 页面中有多个表格,每个表格中均有一从右到左匀速移动的元素,随着元素移动需要在表格中增减数据,由于使用css3动画无法捕捉元素移动位置,所以这里采用js控制dom的写法 解决办法 最终代码放在文章的最后,各位看官…

后端获取请求体Body,将请求体进行解密放回Request请求,并能通过@RequestBody获取

目前系统发送的post和put请求都是没有加密数据。客户需要将请求体加密。而系统已经基本开发完成,不可能一个一个去修改发送的请求。就需要在发送请求时候在拦截器中将body进行加密。并且在后端进行请求过滤解密,并且能通过RequestBody继续获取对象。 1.…

在PostgreSQL中如何实现递归查询,例如使用WITH RECURSIVE构建层次结构数据?

文章目录 解决方案使用WITH RECURSIVE进行递归查询示例代码 总结 在PostgreSQL中,递归查询是一种非常强大的工具,它可以用来查询具有层次结构或树形结构的数据。例如,你可能会在员工-经理关系、目录结构或组织结构图中遇到这样的数据。为了处…