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

ops/2024/10/19 15:25:09/

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

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

  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/ops/9547.html

相关文章

移植speexdsp到OpenHarmony标准系统①

Speexdsp 提到Speexdsp不得不先提到开源语音编解码器Speex 如下是ACM Surveys中收录的标题为《Survey on Application-Layer Mechanisms for Speech Quality Adaptation in VoIP》综述中的一张图表。 它总结了一些常用的可变比特率编解码器,并且做了性能方面的比较…

面试十八、容器适配器

容器适配器是一种特殊类型的容器,它们提供了一种不同于常规容器的接口和行为。容器适配器通常是建立在其他容器之上,通过改变接口或添加限制来满足特定的需求或解决特定的问题。 在 C 中,标准库提供了三种常见的容器适配器: 栈&am…

项目中,如何写 readme.md 文件 | 写项目总结

tips:注意写 1. readme文件:①项目文档(项目需求和设计文档、项目系统架构和技术文档、接口文档)、②项目结构、③启动项目。具体结构见下文。 2. 项目总结:技术栈、描述、主要工作!!需求及功…

web自动化系列-selenium的3种等待方式(十一)

在ui自动化测试中,几乎出现问题最多的情况就是定位不到元素 ,当你的自动化在运行过程中 ,突然发现报错走不下去了 。很大概率就是因为找不到元素 ,而找不到元素的一个主要原因就是页面加载慢 ,代码运行速度快导致 。 …

李廉洋:4.23黄金休市之后大幅下跌,原油小幅度上涨。走势分析!

今年以来推动金价上涨的因素是亚洲的需求,很可能来自各国央行。最近又有零售买盘和一些金融买盘作为补充。目前的问题是,不断上升的债券收益率正在争夺资金。美国2年期国债的收益率接近5%,在美联储降息导致收益率开始下降之前,这仍…

UI5:面向企业级应用的JavaScript框架

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

MyBatis 面试题(六)

1. MyBatis 有几种分页方式? MyBatis 的分页方式主要可以分为两大类:逻辑分页和物理分页。 逻辑分页是一次性把全部数据查询加载进内存,然后再进行分页。这种方式减少了IO次数,适合频繁访问、数据量少的情况,但不适合…

展商企业【广东伟创科技开发有限公司】| 2024水科技大会暨技术装备成果展

企业介绍 广东伟创科技开发有限公司成立于2006年,位于广东省江门市。公司是华南理工大学造纸与污染控制国家工程研究中心科技成果转化单位;是华南理工大学产学研合作单位;是广东省高新技术企业;是江门市现代信息服务业重点企业&am…