手把手教你写一个点菜系统(附源码)| 8月更文挑战


theme: vue-pro

highlight: agate

前言

继上次写了一个 Java SE 版本的 学生成绩管理系统 之后,发现大家反响还不错,所以今天我有带来了差不多一样的点菜系统,希望利用我们所学的 Java SE 知识,实现我们的点菜系统。

而在上次文章的评论中,我也看到了大家的一些建议,可能没有及时回复大家,但是在这次文章中,我会尽量满足大家提的一些好的建议,向着更好的方向前进!

需求分析

此次可以,我们需要设计一个点菜系统,我们就需要对我们的系统进行分析,面向的对象是谁?对象常用的操作又有哪些?

既然是点菜系统,那我们的餐馆一般都是有一个固定的菜单,然后面向的对象一般都是顾客,顾客可以通过这个菜单进行点菜、删除菜,查看已经点过的菜,以及最后用完餐后的结账。

因此,对于点菜系统,主要所需功能如下:

  1. 初始化菜单
  2. 点菜
  3. 移除已点的菜
  4. 查看已点的菜
  5. 结账
  6. 退出系统

点菜系统

功能预览

系统菜单

进入我们的点菜系统之后,一般都是有系统菜单的,用于提示我们进行下一步的操作。

系统菜单

点菜

根据系统菜单进入点菜功能后,输入菜品序号进行点菜以及返回上一级菜单。

点菜

查看已点菜品

假设我们点完菜之后,要确认下有没有点重复的菜,此时就可以查看已点菜品。

当然,上图是我们已经点过菜才会出现菜品,如果我们还没有点过菜,那么系统则会提示还未点菜。

删除菜品

假设我们不小心点了重复的菜,那该怎么办呢?不用担心,我们直接选择删除菜品功能,然后删除对应重复菜品即可。

同样的,加入我们还未点菜就进入删除菜品功能,系统也会给出提示。

结账

当我们用完餐之后,接下来就是结账了。此时只要进入我们的结账选项,系统就会打印出本次所消费的所有金额。

同样的,加入我们还未点菜就进入结账功能,系统也会给出提示。

退出系统

当我们输入选择为 0 时,表示我们退出系统。

功能实现

主界面

系统主界面,主要是打印出功能选择菜单,然后根据我们的输入选择不同的子功能。

  1. package com.cunyu;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Scanner;
  5. /**
  6. * Created with IntelliJ IDEA.
  7. *
  8. * @author : 村雨
  9. * @version : 1.0
  10. * @project : Java 实战
  11. * @package : com.cunyu
  12. * @className : DishApp
  13. * @createTime : 2021/7/31 17:30
  14. * @email : 747731461@qq.com
  15. * @公众号 : 村雨遥
  16. * @website : https://cunyu1943.github.io
  17. * @description : 系统主界面
  18. */
  19. public class DishApp {
  20. public static void main(String[] args) {
  21. Dish dish = new Dish();
  22. // 初始化菜单
  23. List<Dish> dishList = dish.initMenu();
  24. Scanner scanner = new Scanner(System.in);
  25. List<Dish> orderedList = new ArrayList<>();
  26. while (true) {
  27. System.out.println("----------欢迎使用点餐系统--------");
  28. System.out.println("----------【1】点菜--------------");
  29. System.out.println("----------【2】参看已点菜品-------");
  30. System.out.println("----------【3】删除菜品-----------");
  31. System.out.println("----------【4】结账--------------");
  32. System.out.println("----------【0】返回上一级/退出-----");
  33. System.out.println("输入你的选择");
  34. String choice = scanner.next();
  35. switch (choice) {
  36. case "1":
  37. while (true) {
  38. dish.showMenu(dishList);
  39. System.out.println("请输入菜品序号进行点菜,输入 0 则返回上一级菜单");
  40. int id = scanner.nextInt();
  41. if (id == 0) {
  42. break;
  43. }
  44. System.out.println("输入菜品序号:" + id);
  45. System.out.println("你点的菜是:" + dishList.get(id - 1).getName());
  46. // 把已点的菜加入已点菜单
  47. orderedList.add(dishList.get(id - 1));
  48. }
  49. break;
  50. case "2":
  51. dish.showOrderedMenu(orderedList);
  52. break;
  53. case "3":
  54. if (orderedList.isEmpty()) {
  55. System.out.println("当前还未点菜,请重新输入你的选择");
  56. } else {
  57. System.out.println("输入要删除菜品的序号");
  58. int id = scanner.nextInt();
  59. dish.deleteDish(id, dishList, orderedList);
  60. }
  61. break;
  62. case "4":
  63. dish.checkout(orderedList);
  64. break;
  65. case "0":
  66. System.exit(0);
  67. default:
  68. break;
  69. }
  70. }
  71. }
  72. }

主类设计

主要涉及的菜品,于是定义一个菜品类,主要包括序号、菜品名、菜品单价三个属性。

  1. package com.cunyu;
  2. /**
  3. * Created with IntelliJ IDEA.
  4. *
  5. * @author : 村雨
  6. * @version : 1.0
  7. * @project : Java 实战
  8. * @package : com.cunyu
  9. * @className : Dish
  10. * @createTime : 2021/7/31 17:27
  11. * @email : 747731461@qq.com
  12. * @公众号 : 村雨遥
  13. * @website : https://cunyu1943.github.io
  14. * @description : 菜品类
  15. */
  16. public class Dish {
  17. /**
  18. * 编号
  19. */
  20. private int id;
  21. /**
  22. * 菜名
  23. */
  24. private String name;
  25. /**
  26. * 价格
  27. */
  28. private double price;
  29. public int getId() {
  30. return id;
  31. }
  32. public void setId(int id) {
  33. this.id = id;
  34. }
  35. public String getName() {
  36. return name;
  37. }
  38. public void setName(String name) {
  39. this.name = name;
  40. }
  41. public double getPrice() {
  42. return price;
  43. }
  44. public void setPrice(double price) {
  45. this.price = price;
  46. }
  47. public Dish() {
  48. }
  49. public Dish(int id, String name, double price) {
  50. this.id = id;
  51. this.name = name;
  52. this.price = price;
  53. }
  54. }

功能接口

上次的文章中,读者建议我把各个功能独立出接口,然后再实现,所以这里先将各个功能的接口给出来。

  1. package com.cunyu;
  2. import java.util.List;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : 村雨
  7. * @version : 1.0
  8. * @project : Java 实战
  9. * @package : com.cunyu
  10. * @className : DishInterface
  11. * @createTime : 2021/7/31 20:26
  12. * @email : 747731461@qq.com
  13. * @公众号 : 村雨遥
  14. * @website : https://cunyu1943.github.io
  15. * @description :
  16. */
  17. public interface DishInterface {
  18. /**
  19. * 初始化菜单
  20. *
  21. * @return 返回餐厅当前所提供的菜品列表
  22. */
  23. public List<Dish> initMenu();
  24. /**
  25. * 显示菜单
  26. *
  27. * @param dishList 菜品列表
  28. */
  29. public void showMenu(List<Dish> dishList);
  30. /**
  31. * 显示已经点过的菜品
  32. *
  33. * @param orderedList 当前已点菜品
  34. */
  35. public void showOrderedMenu(List<Dish> orderedList);
  36. /**
  37. * 移除菜品
  38. *
  39. * @param id 菜品对应序号
  40. * @param dishList 菜品列表
  41. * @param orderedList 已点菜品列表
  42. */
  43. public void deleteDish(int id, List<Dish> dishList, List<Dish> orderedList);
  44. /**
  45. * 结账
  46. *
  47. * @param orderedList
  48. */
  49. public void checkout(List<Dish> orderedList);
  50. }

初始化菜单

一般餐馆都是提供的固定的菜单,所以这里没有给出管理菜单的功能,直接进行初始化后给出各个菜品,将其存入列表中。

  1. /**
  2. * 初始化菜单
  3. *
  4. * @return 初始化后的菜单
  5. */
  6. public List<Dish> initMenu() {
  7. List<Dish> dishList = new ArrayList<>();
  8. dishList.add(new Dish(1, "黄金手抓骨", 38));
  9. dishList.add(new Dish(2, "乡村爆火肉", 58));
  10. dishList.add(new Dish(3, "养生甲鱼汤", 68));
  11. dishList.add(new Dish(4, "三鲜汤", 28));
  12. dishList.add(new Dish(5, "紫菜蛋花汤", 18));
  13. dishList.add(new Dish(6, "铁板黄金蛋", 38));
  14. dishList.add(new Dish(7, "泡椒炒牛肉", 48));
  15. dishList.add(new Dish(8, "麻婆豆腐", 18));
  16. dishList.add(new Dish(9, "干煸豆角", 28));
  17. dishList.add(new Dish(10, "干锅娃娃菜", 29));
  18. dishList.add(new Dish(11, "干锅土豆丝", 28));
  19. dishList.add(new Dish(12, "清炒时蔬", 25));
  20. dishList.add(new Dish(13, "凉拌黄瓜", 10));
  21. dishList.add(new Dish(14, "胡椒皮蛋", 15));
  22. dishList.add(new Dish(15, "红烧茄子", 20));
  23. return dishList;
  24. }

展示菜品列表

初始化菜单后,把整个菜单展示给顾客看。

  1. /**
  2. * 展示菜单
  3. *
  4. * @param dishList 菜品列表
  5. */
  6. public void showMenu(List<Dish> dishList) {
  7. System.out.println("------------本店菜单------------");
  8. System.out.println("序号\t\t菜名\t\t\t\t单价");
  9. for (int i = 0; i < dishList.size(); i++) {
  10. System.out.format("%d\t\t%s\t\t\t%.2f\n", dishList.get(i).getId(), dishList.get(i).getName(), dishList.get(i).getPrice());
  11. }
  12. System.out.println("---------------------------");
  13. }

展示已点菜品

  1. /**
  2. * 查看已点的菜
  3. */
  4. public void showOrderedMenu(List<Dish> orderedList) {
  5. if (orderedList.isEmpty()) {
  6. System.out.println("当前您还未点餐,请重新输入选择");
  7. } else {
  8. System.out.println("当前您点的菜品如下");
  9. for (int i = 0; i < orderedList.size(); i++) {
  10. System.out.println(orderedList.get(i).getName());
  11. }
  12. }
  13. }

移除菜品

找到对应序号对应的菜品,然后将其移除。

  1. /**
  2. * 删除对应菜品
  3. *
  4. * @param id 菜品对应序号
  5. * @param dishList 菜品列表
  6. * @param orderedList 已点菜品列表
  7. */
  8. public void deleteDish(int id, List<Dish> dishList, List<Dish> orderedList) {
  9. if (!orderedList.isEmpty()) {
  10. orderedList.remove(dishList.get(id - 1));
  11. }
  12. }

结账

先判断是否点菜,如果没有则提示,若已经点过餐,则直接结账。

  1. /**
  2. * 结账
  3. */
  4. public void checkout(List<Dish> orderedList) {
  5. double money = 0.0d;
  6. if (orderedList.isEmpty()) {
  7. System.out.println("当前您还未点餐,请重新输入选择");
  8. } else {
  9. System.out.println("请稍等,正在结算中……");
  10. for (int i = 0; i < orderedList.size(); i++) {
  11. money += orderedList.get(i).getPrice();
  12. }
  13. System.out.format("你此次总共消费:¥ %.2f\n", money);
  14. }
  15. }

总程序

好了,实现以上各个模块功能之后,将其整合到一起,就得到我们最后的总体程序。

各部分的代码都已经贴出来的,不过为了大家更方便,我这这里给出总程序结构。

所有代码均位于 com.cunyu 包下,然后分别是实体类 Dish、接口类 DishInterface 以及主程序 DishApp

总结

好了,以上就是我们点菜系统的实现了。如果你对 Java SE 部分的知识掌握较好的话,这一定不是啥难事,毕竟是个十分简单的控制台程序,主要语法熟悉,稍微理理逻辑即可。

好了,今天的内容就到此结束了,如果你有什么好的建议,欢迎留言交流。

最后的最后,贴出本设计的 Github 仓库地址:https://github.com/cunyu1943/java-in-actions

有需要的童鞋可以自取,当然了,也希望大家给我一个⭐ star,满足一下我这个菜鸟的虚荣心呀 ~ :heart::heart::heart:


文章标签:

原文连接:https://juejin.cn/post/6991230254329102372

相关推荐

Flask框架——消息闪现

34个图片压缩工具集合,包含在线压缩和CLI工具

入门即享受!coolbpf 硬核提升 BPF 开发效率 | 龙蜥技术

基于 OPLG 从 0 到 1 构建统一可观测平台实践

全链路灰度在数据库上我们是怎么做的?

冴羽答读者问:过程比结果重要吗?如果是,怎么理解?如果不是,又怎么解?

接口文档管理工具,选yapi 还是 Apifox? 这里列出了两款软件的深度分析,看完再下载不迟。

基于 Docker 来部署 Vue 或 React 前端项目及 Node 后端服务

三十岁的我,自由了!

如何实现带timeout的input?

统计千行代码Bug率,有没有意义?

814. 二叉树剪枝 : 简单递归运用题

【综合笔试题】难度 3.5\u002F5,多解法热门二叉树笔试题

为什么设计的软件不好用?那是因为不熟悉软件开发模型!一文熟悉软件开发模型

作为前端,我是这样从零实现CI\u002FCD二(node服务部署及前后端联调)

极智开发 | 讲解 Nginx 特性之一:反向代理

Netty 案例之 IM 方案设计

从 Google 离职,前Go 语言负责人跳槽小公司

最终一致性性分布式事务 TCC

不谈源码,聊聊位运算的实际应用