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

【设计模式】腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?

状态模式是什么?

状态模式,也被称作状态对象模式,是一种行为设计模式。

当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

它让对象在其内部状态改变时改变自己的行为。外部调用者无需了解对象内部状态的具体实现,仅需通过简单的接口进行交互

状态模式适用于哪些场景?

当你的对象基于其状态有不同的行为,并且其状态可以在运行时动态转换时,你应该考虑使用状态模式。

如何在Java中实现状态模式?——自动贩卖机

让我们以一个简单的售卖饮料的自动贩卖机为例,来展示如何在Java中实现状态模式。我们首先定义一个状态接口:

public interface State {void insertCoin();void pushButton();void dispense();
}

然后,我们为自动贩卖机的每一种状态实现该接口:

public class NoCoinState implements State {public void insertCoin() {// 接收硬币,并转换状态}public void pushButton() {// 提示用户先投币}public void dispense() {// 无行为}
}public class HasCoinState implements State {public void insertCoin() {// 提示用户已经投过币了}public void pushButton() {// 检查库存,然后转换状态}public void dispense() {// 无行为}
}public class SoldState implements State {public void insertCoin() {// 提示用户等待饮料出货}public void pushButton() {// 提示用户等待饮料出货}public void dispense() {// 出货,然后转换状态}
}

最后,我们实现自动贩卖机类:

public class VendingMachine {private State noCoinState;private State hasCoinState;private State soldState;private State state;  // 当前状态public VendingMachine() {noCoinState = new NoCoinState();hasCoinState = new HasCoinState();soldState = new SoldState();state = noCoinState;  // 初始状态}public void insertCoin() {state.insertCoin();}public void pushButton() {state.pushButton();state.dispense();}// 其他方法,例如改变状态...
}

这样,我们的自动贩卖机就可以根据自身的状态决定相应的行为,而无需在一个方法中使用大量的条件语句来判断状态。此外,如果未来我们需要添加更多的状态或者行为,我们也可以很容易地进行拓展。

另一个例子——音频播放器

让我们从一个现实生活的例子看一看状态模式如何被运用到音频播放器的开发中。

音频播放器根据用户的操作和播放条件,可能有多种的状态:例如,“播放状态”,“暂停状态”,“停止状态"和"缓冲状态”。不同的状态下,音频播放器的响应行为可能会不同。

首先,定义一个状态接口:

public interface State {void play();void pause();void stop();void buffer();
}

然后,实现播放器的每一个状态:

public class PlayingState implements State {public void play() {// 无响应或提示正在播放}public void pause() {// 暂停播放,并转换到暂停状态}public void stop() {// 停止播放,并转换到停止状态}public void buffer() {// 无行为或转到缓冲状态}
}// 类似的,我们还可以定义PauseState、StopState和BufferingState类

在定义了各种状态以后,我们就可以在音频播放器类中使用这些状态:

public class AudioPlayer {private State playingState;private State pauseState;private State stopState;private State bufferingState;private State state;  // 当前状态public AudioPlayer() {playingState = new PlayingState();pauseState = new PauseState();stopState = new StopState();bufferingState = new BufferingState();state = stopState;  // 初始状态}public void play() {state.play();}public void pause() {state.pause();}public void stop() {state.stop();}public void buffer() {state.buffer();}// 其他方法,例如改变状态...
}

这样,音频播放器就可以根据当前的状态来进行不同的操作,比如在"播放状态"下如果用户按了播放按钮,播放器可以选择无响应或者给出正在播放的提示,而在"暂停状态"下则会恢复播放。这就是状态模式的魅力,使得音频播放器的代码更易于管理和维护。如果我们需要添加新的状态或行为,也可以轻松地进行拓展。希望通过这篇博文,你能对状态模式有更深入的理解和应用。

相关文章:

  • 上门回收小程序,打造回收新模式
  • 【网络安全】常见的网络威胁有哪些?
  • 外网ssh远程连接服务器
  • 【FINEBI】finebi中常用图表类型及其适用场景
  • C#的WPF使用OFFICE库播放PPT
  • 复合机器人颠覆传统上下料,实现高效精准生产
  • vue3-elementPlus部分组件样式修改
  • 71 C++ Linux下的 不用 g++优化行为,验证一些问题
  • 网络协议与攻击模拟_06攻击模拟SYN Flood
  • 2024-01-23(MongoDBElasticSearch)
  • 流动的边框用css怎么实现
  • 国标GB28181协议EasyCVR启动失败报错“Local Machine Check Error”的解决方法
  • Spring/Spring boot项目接入traceId
  • Golang TCP/IP服务器/客户端应用程序,设计一个简单可靠帧传送通信协议。(并且正确处理基于流式控制协议,带来的应用层沾帧[沾包]问题)
  • Linux调试器-gdb使用
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Django 博客开发教程 16 - 统计文章阅读量
  • Phpstorm怎样批量删除空行?
  • Promise初体验
  • 多线程事务回滚
  • 浮现式设计
  • 关于Java中分层中遇到的一些问题
  • 汉诺塔算法
  • 异常机制详解
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • HanLP分词命名实体提取详解
  • Java数据解析之JSON
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • *** 2003
  • .bashrc在哪里,alias妙用
  • .bat批处理(一):@echo off
  • .Net MVC4 上传大文件,并保存表单
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .net2005怎么读string形的xml,不是xml文件。
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net项目IIS、VS 附加进程调试
  • .net中调用windows performance记录性能信息
  • .sh 的运行
  • ?.的用法
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @EnableAsync和@Async开始异步任务支持
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [17]JAVAEE-HTTP协议
  • [2023-年度总结]凡是过往,皆为序章
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [BUUCTF 2018]Online Tool
  • [go] 策略模式