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

这篇具有很好参考价值的文章主要介绍了腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

状态模式是什么?

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

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

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

腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?,设计模式,前端,面试,java,设计模式

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

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

如何在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();
    }
    
    // 其他方法,例如改变状态...
}

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

到了这里,关于腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 腾讯系统测试一面+二面+HR面(面经)

    从3月内推后(内推岗位是运维),经历了两面,被告知岗位不合适,然后凉凉到了3月底。紧接着参加了在4月的笔试,终于在4.23接到了腾讯再一次的面试,4.26已经完成所有面试,状态是offer报批中,等待offer call中,在五一假期期间拒绝了南方基金的offer,5.4终于收到offer。

    2024年02月04日
    浏览(28)
  • 2023秋招--腾讯天美--游戏客户端--二面面经

    2023秋招–腾讯天美–游戏客户端–一面面经 面试官提问:20min 自我介绍。 大学学了哪些课程? C#用的多还是C++? 内存对齐了解吗?说下原理以及为什么需要内存对齐 C#怎么调用C++代码? StringBuilder和String的区别?拼接字符串有什么区别?StringBuilder一定优于String? 场景题:

    2024年02月05日
    浏览(38)
  • 腾讯二面:有 40 亿个 QQ 号,限制 1G 内存,问如何去重?被问懵了!

    40亿个QQ号,限制1G内存,如何去重? 40亿个unsigned int,如果直接用内存存储的话,需要: 4*4000000000 /1024/1024/1024 = 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的。 想要实现这个功能,可以借助位图。 使用位图的话,一个数字只需要占用1个bit,那么40亿个

    2024年02月07日
    浏览(25)
  • 腾讯二面:如何保证接口幂等性?高并发下的接口幂等性如何实现?

    什么是接口幂等性 接口幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。在互联网领域,特别是在Web服务、API设计和分布式系统中,接口幂等性具有非常重要的意义。 具体到HTTP接口或者

    2024年03月19日
    浏览(36)
  • uniapp之音频播放器

    日常业务会遇到 微信音频 mp3播放器, 特别是微信文章阅读,下面仅作参考 1.解决滑动卡顿bug 加了防抖 2.滑动进度条时 先暂停再播放 就不会出现卡顿 3.初始化时 要onCanplay钩子中 setInterval 获取音频文件长度 不然会显示 0 注意用了vantUI 框架的icon 不用可以去掉 换图片或者其他

    2024年02月11日
    浏览(27)
  • Python实现本地视频/音频播放器

    在Python中,有几个库可以用于视频播放,但是没有一个库是完美的,因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器,再介绍用Python实现本地音乐播放器。 Python 实现本地视频播放器 与HTML5+JavaScript实现本地视频播放器相比,使用Python实现比

    2024年04月26日
    浏览(28)
  • Audio API 实现音频播放器

    市面上实现音频播放器的库有很多,比如wavesurfer.js、howler.js等等,但是都不支持大音频文件处理,100多M的文件就有可能导致程序崩溃。总之和我目前的需求不太符合,所以打算自己实现一个音频播放器,这样不管什么需求 在技术上都可控。下面我们简单介绍下 wavesurferJs 、

    2024年02月10日
    浏览(32)
  • 播放器开发(六):音频帧处理并用SDL播放

    AudioOutPut 模块 1、初始化【分配缓存、读取信息】 2、开始线程工作【从队列读帧-重采样-SDL回调-写入音频播放数据-SDL进行播放】 分配缓存 重采样相关 SDL的音频回调 AudioOutPut PlayerMain 添加音频输出代码 测试运行结果 如果需要同时执行视频和音频的输出,记得要在解复用模块

    2024年02月20日
    浏览(31)
  • Vue实现自定义音频播放器组件

    template javascript less 文档参考 关于 Audio 自定义样式 H5 audio 音频标签自定义样式修改以及添加播放控制事件

    2024年02月12日
    浏览(25)
  • Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器

    Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器实例的示例: 上述代码中,使用 getInstance() 方法获取 AudioPlayer 的单例对象,参数传入 Context 对象。 在 getInstance() 方法中判断单例对象是否为空,如果为空则创建新的 AudioPlayer 对象,否则返回已有的单例对象。 这样

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包