如何用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.javapublic 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.javapublic 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 发布!
相关文章:
如何用Java设计自动售货机?
如何用Java设计自动售货机?是大多在高级Java开发人员面试中经常被问到的好问题之一。在典型的编码面试中,你会得到一个问题描述来开发一个售货机,在有限的时间内,通常2到3小时内,你需要在Java中编写设计文档、工作代码和单元测试。这种Java面试的一个关键优势是可以一次测试候…...
JAVA数据代码示例
首先,我们需要导入一些必要的Java库 java import java.net.URL; import java.net.HttpURLConnection; import java.io.BufferedReader; import java.io.InputStreamReader; 然后,我们可以创建一个URL对象,表示我们要爬取的网页的URL。 jav…...
github常用搜索指令
一、常用搜索指令 以下指令可分开用,也可组合使用 根据关键字搜索 in:name xx继上一步:指定开发语言 language:Java in:name XX language:Java继上一步,指定更新日期 pushed:>2022-06-06 in:name XX language:Java pushed:>2022-0…...
为什么esp8266刷入了固件,无法接受AT指令
我遇到的解决方法是:是串口调试助手出了问题。所以需要更换一个串口调试助手软件。 上面这个就是我换了的软件 在开发的时候,经常会遇到软件故障,导致正确的方法,但是没有效果,好比以前用盗版的8.7版本的Proteus模拟…...
Scala---字符串、集合
一、字符串 StringStringBuilder 可变string操作方法举例 比较:equals比较忽略大小写:equalsIgnoreCaseindexOf:如果字符串中有传入的assci码对应的值,返回下标 1./** 2.* String && StringBuilder 3.*/ 4.val str "abcd" 5.val s…...
Power Automate-当收到HTTP请求时触发流程
选择创建自动化云端流,点跳过 第一个操作搜索HTTP,点击当收到HTTP请求时 点击使用示例有效负载生成架构 写入JSON,点击完成 正文JSON架构就自动生成了,再点击左下角的显示高级选项 Method根据需求选择 可以选择JSON中的参数赋值给…...
学习c#的第十四天
目录 C# 接口(Interface) 接口的特点 定义接口 接口继承 接口和抽象类的区别 C# 命名空间(Namespace) using 关键字 定义命名空间 嵌套命名空间 C# 接口(Interface) 接口定义了所有类继承接口时应…...
6.jvm中对象创建流程与内存分配
目录 概述对象的创建流程对象的内存分配方式对象怎样才会进入老年代大对象直接进入老年代内存担保 jvc 相关指令查看jdk默认使用的gc查看当前jdk支持的有哪些gc查看指定进程当前正在使用的gc 结束 概述 相关文章在此总结如下: 文章地址jvm基本知识地址jvm类加载系…...
算法--搜索与图
这里写目录标题 主要内容DFS思想 BFS思想 DFS与BFS的比较一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 主要内容 DFS 思想 会优先向深处搜索 一旦到达最深处 那么会回溯 但是在回溯的过程中 会边回溯边观察是否有能继…...
ROS 文件系统
ROS文件系统级指的是在硬盘上ROS源代码的组织形式,ROS 的文件系统本质上都还是操作系统文件,可以使用Linux命令来操作这些文件,文件操作,包含增删改查与执行等操作,ROS文件系统的一些常用命令如下: 1.增加…...
车载通信与DDS标准解读系列(1):DDS-RPC
▎RPC & DDS-RPC RPC:Remote Procedure Call,远程过程调用。 远程过程调用是一种进程间通信,它允许计算机程序在另一个地址空间中执行子程序,就好像用别人的东西像用自己的一样,常用于分布式系统。 远程过程调用…...
通过构造树形结构介绍map的用法
构造TreeSelect树形结构: 当我们拿到的数据与我们要用的数据不一致时,就要改造成自己想要的数据结构。 后端拿到的数据结构: public class TPMGroup{public string DepName { get; set; }public List<staff> TPMList { get; set; }pu…...
代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和
1143.最长公共子序列 力扣题目链接 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何…...
Oracle JDBC数据库驱动程序介绍
Maven Central上所有Oracle JDBC数据库驱动程序 现在不仅可以在Maven Central上使用甲骨文数据库最新版本,而且还可以获得所有受支持的Oracle JDBC驱动程序发行版,包括19.3.0.0、18.3.0.0、12.2.0.1和11.2.0.4。从现在开始,Maven Central确实…...
scipy实现单因素方差分析
经典例题 某校高二年级共有四个班,采用四种不同的教学方法进行数学教学,为了比较这四种教学法的效果是否存在明显的差异,期末统考后,从这四个班中各抽取 5 名考生的成绩,如下所示。 班级 一班 二班 三班 四班 …...
深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通
大家好,我是微学AI,今天给大家介绍一下深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通。transformer是一种基于自注意力机制的深度学习模型,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初被设计用来处理序…...
一阶滤波器(一阶巴特沃斯滤波器)
连续传递函数G(s) 离散传递函数G(z) 转换为差分方程形式 一阶巴特沃斯滤波器Filter Designer参数设计:参考之前的博客Matlab的Filter Designer工具设计二阶低通滤波器 设计采样频率100Hz,截止频率20Hz。 注意:设计参数使用在离散系统中&…...
.net core中前端vue HTML5 History 刷新页面404问题
放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…...
【152.乘积最大子数组】
目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int maxProduct(vector<int>& nums) {int nnums.size();vector<int> f(n);vector<int> g(n);f[0]g[0]nums[0];int retnums[0];for(int i1;…...
如何开发OA系统场景的系统架构
1.开发OA系统场景的系统架构 针对开发OA系统的场景,以下是一个简单的系统架构示例,包括前端、后端和数据库三个基本部分: 前端: 使用React框架进行前端开发,构建用户界面和交互逻辑。前端模块包括日程管理模块、文档管…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
