如何用Java设计自动售货机?

这篇具有很好参考价值的文章主要介绍了如何用Java设计自动售货机?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何用Java设计自动售货机?是大多在高级Java开发人员面试中经常被问到的好问题之一。在典型的编码面试中,你会得到一个问题描述来开发一个售货机,在有限的时间内,通常2到3小时内,你需要在Java中编写设计文档、工作代码和单元测试。这种Java面试的一个关键优势是可以一次测试候选人的许多基本技能。为了完成售货机的设计、编码和单元测试,候选人需要在这三个方面都非常出色。

顺便说一句,这种真实世界的问题也是一个很好的练习,可以提高你的面向对象分析和设计技能,如果你想成为一个好的应用程序开发人员,这一点非常重要。

通过在Java或任何其他面向对象语言中设计售货机,你不仅可以学习基础知识,如封装、多态或继承,而且还可以在解决问题或设计应用程序时学习使用抽象类和接口的巧妙细节。

通常,这种问题也提供了利用Java设计模式的机会,在这个问题中,我们将使用工厂方法模式来创建不同类型的售货机。我在分享20个Java软件设计问题(此处)时谈到过这个问题,之后,我收到许多反馈要为该问题提供解决方案。

这篇两部分文章将为Java中的售货机问题提供解决方案。顺便说一句,这个问题可以以不同的方式解决,在查看这里给出的解决方案之前,你应该尝试做到这一点。这也是一个重温SOLID和OOPS设计原则的机会,请参阅此处,并准备在代码中使用它们。在Java中设计售货机时,你会发现其中许多适用。

顺便说一句,如果你认真对待学习设计模式和原则,我建议你查看Udemy上的Java设计模式课程。该课程涵盖了SOLID设计原则,如开闭原则和Liskov替换,以及所有重要的面向对象设计模式,如装饰者、观察者、责任链等等。

问题陈述

你需要设计一个售货机,该售货机

  • 接受1、5、10、25美分的硬币,即便士、五分币、十分币和25美分。

  • 允许用户选择产品:可乐(25美分)、百事可乐(35美分)、汽水(45美分)

  • 允许用户通过取消请求获得退款。

  • 如果有剩余,则返回所选产品和剩余找零

  • 允许售货机供应商重置操作。

需求陈述是问题中最重要的部分。你需要多次阅读问题陈述,以对问题获得高层次的理解,以及你正在尝试解决的问题。通常,需求并不十分清晰,你需要通过阅读问题陈述来制定自己的需求列表。

我喜欢基于要点的需求,因为它很容易跟踪。一些需求也是隐含的,但最好在你的列表中将它们明确化,例如,在这个问题中,如果售货机没有足够的零钱来完成交易,它就不应接受请求。

不幸的是,没有多少书籍或课程教会你这些技能,你需要通过一些真实的工作来自己开发这些技能。

尽管有两种资源帮助我提高了面向对象分析和设计技能,那就是Educative上的《深入面向对象设计面试》,这是一门互动课程,允许你在浏览器上练习面向对象问题,我强烈推荐这门课程来提升你的面向对象设计技能。

Java软件设计问题 - 自动售货机解决方案

第二个资源是Brett D. McLaughlin的《面向对象设计与分析入门》第一版。如果你没有太多面向对象编程经验,这是最好的书籍之一。

解决方案和编码

我对Java售货机的实现具有以下类和接口:

  • VendingMachine
    定义售货机的公共API,通常所有高级功能都应在此类中

  • VendingMachineImpl
    Vending Machine的一个示例实现

  • VendingMachineFactory
    创建不同种类Vending Machine的工厂类

  • Item
    表示Vending Machine提供的商品的Java枚举

  • Inventory
    表示库存的Java类,用于在Vending Machine内创建存款和商品库存

  • Coin
    另一个Java枚举,表示Vending Machine支持的硬币

  • Bucket
    一个参数化类来保存两个对象。它有点像Pair类。

  • NotFullPaidException
    当用户试图收集一个项目而不支付全额时,Vending Machine会抛出此异常。

  • NotSufficientChangeException
    Vending Machine抛出此异常以指示其没有足够的找零来完成此请求。

  • SoldOutExcepiton
    如果用户请求的商品已售完,Vending Machine会抛出此异常。

以下是Java中售货机的完整代码,请确保测试此代码,如果遇到任何问题,请告知我。

// VendingMachine.java

public interface VendingMachine {
   
  public long selectItemAndGetPrice(Item item);
  
  public void insertCoin(Coin coin);
  
  public List<Coin> refund();

  public Bucket<Item, List<Coin>> collectItemAndChange();

  public void reset();

}

// VendingMachineImpl.java

public class VendingMachineImpl implements VendingMachine {

  private Inventory<Coin> cashInventory = new Inventory<Coin>();

  private Inventory<Item> itemInventory = new Inventory<Item>();

  private long totalSales;

  private Item currentItem;

  private long currentBalance;

  public VendingMachineImpl(){
    initialize();
  }

  private void initialize(){

    // initialize machine 
    for(Coin c : Coin.values()){
      cashInventory.put(c, 5); 
    }

    for(Item i : Item.values()){
      itemInventory.put(i, 5);
    }

  }

  // 其他方法

  public void printStats(){
    System.out.println("Total Sales : " + totalSales);
    System.out.println("Current Item Inventory : " + itemInventory);
    System.out.println("Current Cash Inventory : " + cashInventory);
  }

}

// 其他类定义

这就是本文第一部分中如何用Java设计售货机的内容。在这一部分中,我们通过创建所有类和编写所有代码来解决问题,但单元测试和设计文档仍在等待中,您将在本文的第二部分中看到。

如果你愿意,你可以通过创建单元测试来运行这个问题,或者也许通过使用线程使其成为一个应用程序,然后使用另一个线程来充当用户。

如果你需要更多面向对象设计问题用于练习,我建议你查看Educative上的《深入面向对象设计面试》课程,这是一个交互式学习平台。该课程由谷歌、Facebook、微软和亚马逊的招聘经理设计,包含这些科技巨头常问的一些面向对象设计问题的解决方案。
原文链接

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-749499.html

到了这里,关于如何用Java设计自动售货机?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 自动售货机仿真操作设计verilog代码AX301开发板Quartus

    名称:自动售货机仿真操作设计verilog代码AX301开发板Quartus 软件:Quartus 语言:Verilog 代码功能: 具有单价0.5、1.0、1.5、2.0元的4种商品 可以通过按键选择商品 可以投币 投币后按键确认购买 购买成功后找零,若投币不足则直接退钱,不出商品 找零时间3秒 本代码已在AX301开发板

    2024年02月20日
    浏览(29)
  • python自动售货机

    分享python实现自动售货一个小作业 输入2进行购买商品,输入商品id和数量,可以选择不同商品,最后进行结账操作。 可以有两种查询方式,全部查询和按时间条件查询 具体操作如下: 全部查询: 时间条件查询: 就按4直接退出23333 其实就是参考路边的自动售货机贩卖饮料啥的,

    2024年02月11日
    浏览(22)
  • 【Python实训】饮品自动售货机

    这段代码定义了三个函数:show_goods()、total()和main()。show_goods()函数用于展示饮品信息,total()函数用于计算总额,main()函数用于控制整个饮品自动售货机的操作流程。 运行程序后,会首先调用show_goods()函数展示饮品信息,然后用户可以根据展示的信息选择饮品和数量,输入

    2024年02月05日
    浏览(32)
  • 基于FPGA的自动售货机

    目录 一、项目功能 二、设计思路 按键实现: 数码管 蜂鸣器 LED灯 三、流程图 四、代码实现 1、按键消抖  key_debounce.v  2、LED状态选择  led_drive.v 3、蜂鸣器模块   beep_drive.v 4、数码管位选信号选择  sel_drive.v 5、数码管段选信号选择     seg_drive.v 6、售货机按键选择处理

    2024年02月06日
    浏览(23)
  • 【FPGA入门八】自动售货机

    功能完整描述: KEY4:开关机按键,复位时,默认是关机状态,数码管和LED灯均不亮,同时蜂鸣器响,其余按键按下无效。 KEY3:在开机状态时,投币1元 KEY2:在开机状态时,投币为0.5元 KEY1:当投币但少于货物的价格时,取消订单,数码管显示为0.0,同时LED灯实现跑马灯2s然

    2024年02月08日
    浏览(27)
  • FPGA实现简易的自动售货机模型

    环境: 1、Quartus18.1 2、vscode 3、板子型号:EP4CE6F17C8N 要求: 自动售货机功能: 1.两个按键用于投币,1个1元,1个5角 2.一个按键用于商品选择,农夫山泉2块,干脆面1块5 3.找零 设计: 我们选择使用四个按键,分别用于投币一元、五角、商品选择、结算四个功能。用六位数码管

    2024年02月09日
    浏览(27)
  • 自动售货机销售数据分析与应用

    本书不仅适用于零基础的读者自学,还适用于教师教学,为了帮助读者更加高效地掌握本书的内容,本书提供了以下10项附加价值: (1)建模平台:提供一站式大数据挖掘建模平台,免配置,包含大量案例工程,边练边学,告别纸上谈兵 (2)视频讲解:提供不少于600分钟

    2024年02月08日
    浏览(31)
  • 【FPGA】基于状态机实现自动售货机模拟

    此自动售货机模拟基于EP4CE6F17C8开发板实现,用按键,led灯,数码管表示各个输入输出 功能: 此自动售货机可以选择A(三元)与B(五元)商品且选择商品数量,一次可以投1块与5块钱。当投币数量满足商品价格时则能出货,且退款额外支付,在任意阶段皆可以取消支付并退

    2024年02月16日
    浏览(31)
  • VIVADO自动售票机售货机verilog代码ego1开发板验证

    名称:VIVADO自动售票机售货机verilog代码ego1开发板验证 软件:VIVADO 语言:Verilog 代码功能: 自动售票机  1、自动售票机只出售1角、2角、5角和1元4种车票 2、只接收1角、5角和1元硬币,每次只能出售1张车  3、自动售票机具有累加销售额的功能 实验要求  出售车票用SW0~3分别

    2024年02月05日
    浏览(35)
  • 【Python】python自动售货机销售数据分析

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 近年来,随着我国经济技术的不断提升,

    2024年02月06日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包