【设计模式】腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?
状态模式是什么?
状态模式,也被称作状态对象模式,是一种行为设计模式。
当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
它让对象在其内部状态改变时改变自己的行为。外部调用者无需了解对象内部状态的具体实现,仅需通过简单的接口进行交互。
状态模式适用于哪些场景?
当你的对象基于其状态有不同的行为,并且其状态可以在运行时动态转换时,你应该考虑使用状态模式。
如何在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();}// 其他方法,例如改变状态...
}
这样,音频播放器就可以根据当前的状态来进行不同的操作,比如在"播放状态"下如果用户按了播放按钮,播放器可以选择无响应或者给出正在播放的提示,而在"暂停状态"下则会恢复播放。这就是状态模式的魅力,使得音频播放器的代码更易于管理和维护。如果我们需要添加新的状态或行为,也可以轻松地进行拓展。希望通过这篇博文,你能对状态模式有更深入的理解和应用。
相关文章:

【设计模式】腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?
状态模式是什么? 状态模式,也被称作状态对象模式,是一种行为设计模式。 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 它让对象在其内部状态改变时改变自己的行为。外部调用者无需了…...
转换操作符转换类型:普通函数指针(普通函数、类的静态函数)、类的成员函数指针
一、转换操作符的定义 转换操作符是一种特殊的类成员函数 ,它定义将类类型值转变为其他类型值的转换,转换操作符在类定义体内声明,在保留字operator之后跟着转换的目标类型,转换函数采用如下通用形式: operator type(…...
易控智驾高精度地图开发工程师校招一面、二面面经
本文介绍2024届秋招中,北京易控智驾科技有限公司的高精度地图开发工程师岗位的2场面试基本情况、提问问题等。 12月投递了北京易控智驾科技有限公司的高精度地图开发工程师岗位,所在部门暂不清楚。目前完成了一面、二面流程,在这里记录一下2场…...

用VSCode玩STM32的烧录工具 CooCox Cortex Flash Programmer
一、下载软件 经热心兄弟推荐的版本,不知道有没有版权,如有版权问题,请通知删除。 CSDN - 0积分下载:https://download.csdn.net/download/qq_49053936/88744187 二、生成bin文件 插件不同,方法有所不同,各…...

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server
在Pycharm上部署项目到远程服务器,有时候需要启动SSH会话,启动的时候发现没反应,且事件日志显示:无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边,发现“无默…...
c++设计模式之单例模式
介绍 一个类无论创建多少对象,都只能得到一个实例 A* p1new A(); A* p2new A(); A* p3new A(); 如上述代码中,我们通过new运算符创建出了类A的三个对象实例,而我们现在要做的是,如何设计类A,使得上述代码运行之后永远…...

Git学习笔记(第5章):Git团队协作机制
目录 5.1 团队内协作 5.2 跨团队协作 Git进行版本控制都是在本地库操作的。若想使用Git进行团队协作,就必须借助代码托管中心。 5.1 团队内协作 问题引入:成员1(大佬)利用Git在宿主机上初始化本地库,完成代码的整体…...

Python 面向对象绘图(Matplotlib篇-16)
Python 面向对象绘图(Matplotlib篇-16) 🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…...
Linux开机自动挂载window密码有转义字符的共享文件夹
项目上遇到需要自动挂载windows共享盘到linux系统中,由于windows密码有英文逗号(,),被linux识别成了参数分隔符,在网上找了很多办法都不行,后来通过这种方式完美解决,linux系统是centos8.4文章阅读操作时间在5分钟左右…...

Redis(四)
1、Redis的单/多线程 1.1、单线程 其实直接说Redis什么单线程或者是多线程,不太准确,在redis的4.0版主之前是单线程,然后在之后的版本中redis的渐渐改为多线程。 Redis是单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#…...
一文解读ISO26262安全标准:术语
一文解读ISO26262安全标准:术语 做汽车行业的人,都知道安全标准ISO26262,但是仔细说说它到底讲的是什么?好像又说不出来,这是个玄之又玄的话题,笔者试图将这份标准以简明扼要、并且容易理解的形式梳理出来&…...

使用stable diffussion插件StableSR将图片高清放大
一:需要安装的插件 1、StableSR,项目地址:https://github.com/pkuliyi2015/sd-webui-stablesr 不过国内没什么用,访问不了,可以用下面的国内镜像: https://gitee.com/han51535/sd-webui-stablesr.git 这…...
ActiveMQ:专注消息传递,助您构建高效稳定的系统
在数字化世界的今天,应用程序和系统之间的通信变得日益重要,为了确保数据能够在不同的服务和组件之间高效、可靠地传输,消息队列技术应运而生。 Apache ActiveMQ 作为一种流行的开源消息队列技术,为企业级应用提供了强大的支持&am…...

小程序样例1:简单待办列表
基本功能: 显示所有待办列表(点击不同的文本进行显示) 没完成的待办 已完成的待办 新建待办test 清除待办foo 代码js文件: //index.js //获取应用实例 const app getApp(); Page({data: {todo: ,todos: [{"id": 1474…...

Jvm相关知识(面试高级必备)
类的实例化顺序 先静态、先父后子 先静态:父静态>子静态 优先级:父类>子类 静态代码块>非静态代码块>构造函数 一个类的实例化过程: ①.父类的static代码块,当前类的static; ②.顺序执行…...
android 常规log的查看与抓取
ProtoLog开关 在代码中我们经常看见ProtoLog打印的log,如下: ProtoLog.i(WM_DEBUG_ANIM, "Animation start delayed for %s", mAnimatable);这种log正常情况不会显示,因此我们需要打开开关,其格式为: adb …...

【SpringBoot】—— 如何创建SpringBoot工程
SpringBoot简化了Spring应用的初始搭建和开发过程。 工程创建 新建模块 出现java: 错误: 无效的源发行版:18这样的错误, 修改pom.xml文件 出现以下信息,即运行成功 修改默认端口 创建application.yml文件 内容: server:port:…...

2018年认证杯SPSSPRO杯数学建模A题(第二阶段)海豚与沙丁鱼全过程文档及程序
2018年认证杯SPSSPRO杯数学建模 基于聚类分析的海豚捕食合作策略 A题 海豚与沙丁鱼 原题再现: 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗,所以在距离较远时,海豚只能使用回声定位方法来判断鱼群的整体位置,难…...
C# tcp客户端字符串(图片名称)+ 图片数据打包,发送到服务端;服务端接收到数据后解析数据包
在C#中,要将字符串和图片数据打包发送到服务端,并在服务端解析这些数据,可以按照以下步骤进行: 客户端打包数据 1、创建一个自定义的数据结构来保存字符串和图片数据。 2、将字符串转换为字节数组。 3、将图片数据转换为字节数组。…...

【机组】算术逻辑单元带进位运算实验的解密与实战
🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌺一、 实验目…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...