新鮮出爐的點菜系統(tǒng)(附源碼)
本文已收錄至:https://cunyu1943.blog.csdn.net/
前言
繼上次寫了一個 Java SE 版本的 學(xué)生成績管理系統(tǒng) 之后,發(fā)現(xiàn)大家反響還不錯,所以今天我有帶來了差不多一樣的點菜系統(tǒng),希望利用我們所學(xué)的 Java SE 知識,實現(xiàn)我們的點菜系統(tǒng)。
而在上次文章的評論中,我也看到了大家的一些建議,可能沒有及時回復(fù)大家,但是在這次文章中,我會盡量滿足大家提的一些好的建議,向著更好的方向前進(jìn)!
需求分析
此次可以,我們需要設(shè)計一個點菜系統(tǒng),我們就需要對我們的系統(tǒng)進(jìn)行分析,面向的對象是誰?對象常用的操作又有哪些?
既然是點菜系統(tǒng),那我們的餐館一般都是有一個固定的菜單,然后面向的對象一般都是顧客,顧客可以通過這個菜單進(jìn)行點菜、刪除菜,查看已經(jīng)點過的菜,以及最后用完餐后的結(jié)賬。
因此,對于點菜系統(tǒng),主要所需功能如下:
初始化菜單 點菜 移除已點的菜 查看已點的菜 結(jié)賬 退出系統(tǒng)

功能預(yù)覽
系統(tǒng)菜單
進(jìn)入我們的點菜系統(tǒng)之后,一般都是有系統(tǒng)菜單的,用于提示我們進(jìn)行下一步的操作。

點菜
根據(jù)系統(tǒng)菜單進(jìn)入點菜功能后,輸入菜品序號進(jìn)行點菜以及返回上一級菜單。

查看已點菜品
假設(shè)我們點完菜之后,要確認(rèn)下有沒有點重復(fù)的菜,此時就可以查看已點菜品。

當(dāng)然,上圖是我們已經(jīng)點過菜才會出現(xiàn)菜品,如果我們還沒有點過菜,那么系統(tǒng)則會提示還未點菜。

刪除菜品
假設(shè)我們不小心點了重復(fù)的菜,那該怎么辦呢?不用擔(dān)心,我們直接選擇刪除菜品功能,然后刪除對應(yīng)重復(fù)菜品即可。

同樣的,加入我們還未點菜就進(jìn)入刪除菜品功能,系統(tǒng)也會給出提示。

結(jié)賬
當(dāng)我們用完餐之后,接下來就是結(jié)賬了。此時只要進(jìn)入我們的結(jié)賬選項,系統(tǒng)就會打印出本次所消費的所有金額。

同樣的,加入我們還未點菜就進(jìn)入結(jié)賬功能,系統(tǒng)也會給出提示。

退出系統(tǒng)
當(dāng)我們輸入選擇為 0 時,表示我們退出系統(tǒng)。

功能實現(xiàn)
主界面
系統(tǒng)主界面,主要是打印出功能選擇菜單,然后根據(jù)我們的輸入選擇不同的子功能。
package com.cunyu;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
*
* @author : 村雨
* @version : 1.0
* @project : Java 實戰(zhàn)
* @package : com.cunyu
* @className : DishApp
* @createTime : 2021/7/31 17:30
* @email : [email protected]
* @公眾號 : 村雨遙
* @website : https://cunyu1943.github.io
* @description : 系統(tǒng)主界面
*/
public class DishApp {
public static void main(String[] args) {
Dish dish = new Dish();
// 初始化菜單
List<Dish> dishList = dish.initMenu();
Scanner scanner = new Scanner(System.in);
List<Dish> orderedList = new ArrayList<>();
while (true) {
System.out.println("----------歡迎使用點餐系統(tǒng)--------");
System.out.println("----------【1】點菜--------------");
System.out.println("----------【2】參看已點菜品-------");
System.out.println("----------【3】刪除菜品-----------");
System.out.println("----------【4】結(jié)賬--------------");
System.out.println("----------【0】返回上一級/退出-----");
System.out.println("輸入你的選擇");
String choice = scanner.next();
switch (choice) {
case "1":
while (true) {
dish.showMenu(dishList);
System.out.println("請輸入菜品序號進(jìn)行點菜,輸入 0 則返回上一級菜單");
int id = scanner.nextInt();
if (id == 0) {
break;
}
System.out.println("輸入菜品序號:" + id);
System.out.println("你點的菜是:" + dishList.get(id - 1).getName());
// 把已點的菜加入已點菜單
orderedList.add(dishList.get(id - 1));
}
break;
case "2":
dish.showOrderedMenu(orderedList);
break;
case "3":
if (orderedList.isEmpty()) {
System.out.println("當(dāng)前還未點菜,請重新輸入你的選擇");
} else {
System.out.println("輸入要刪除菜品的序號");
int id = scanner.nextInt();
dish.deleteDish(id, dishList, orderedList);
}
break;
case "4":
dish.checkout(orderedList);
break;
case "0":
System.exit(0);
default:
break;
}
}
}
}
主類設(shè)計
主要涉及的菜品,于是定義一個菜品類,主要包括序號、菜品名、菜品單價三個屬性。
package com.cunyu;
/**
* Created with IntelliJ IDEA.
*
* @author : 村雨
* @version : 1.0
* @project : Java 實戰(zhàn)
* @package : com.cunyu
* @className : Dish
* @createTime : 2021/7/31 17:27
* @email : [email protected]
* @公眾號 : 村雨遙
* @website : https://cunyu1943.github.io
* @description : 菜品類
*/
public class Dish {
/**
* 編號
*/
private int id;
/**
* 菜名
*/
private String name;
/**
* 價格
*/
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Dish() {
}
public Dish(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
}
功能接口
上次的文章中,讀者建議我把各個功能獨立出接口,然后再實現(xiàn),所以這里先將各個功能的接口給出來。
package com.cunyu;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @author : 村雨
* @version : 1.0
* @project : Java 實戰(zhàn)
* @package : com.cunyu
* @className : DishInterface
* @createTime : 2021/7/31 20:26
* @email : [email protected]
* @公眾號 : 村雨遙
* @website : https://cunyu1943.github.io
* @description :
*/
public interface DishInterface {
/**
* 初始化菜單
*
* @return 返回餐廳當(dāng)前所提供的菜品列表
*/
public List<Dish> initMenu();
/**
* 顯示菜單
*
* @param dishList 菜品列表
*/
public void showMenu(List<Dish> dishList);
/**
* 顯示已經(jīng)點過的菜品
*
* @param orderedList 當(dāng)前已點菜品
*/
public void showOrderedMenu(List<Dish> orderedList);
/**
* 移除菜品
*
* @param id 菜品對應(yīng)序號
* @param dishList 菜品列表
* @param orderedList 已點菜品列表
*/
public void deleteDish(int id, List<Dish> dishList, List<Dish> orderedList);
/**
* 結(jié)賬
*
* @param orderedList
*/
public void checkout(List<Dish> orderedList);
}
初始化菜單
一般餐館都是提供的固定的菜單,所以這里沒有給出管理菜單的功能,直接進(jìn)行初始化后給出各個菜品,將其存入列表中。
/**
* 初始化菜單
*
* @return 初始化后的菜單
*/
public List<Dish> initMenu() {
List<Dish> dishList = new ArrayList<>();
dishList.add(new Dish(1, "黃金手抓骨", 38));
dishList.add(new Dish(2, "鄉(xiāng)村爆火肉", 58));
dishList.add(new Dish(3, "養(yǎng)生甲魚湯", 68));
dishList.add(new Dish(4, "三鮮湯", 28));
dishList.add(new Dish(5, "紫菜蛋花湯", 18));
dishList.add(new Dish(6, "鐵板黃金蛋", 38));
dishList.add(new Dish(7, "泡椒炒牛肉", 48));
dishList.add(new Dish(8, "麻婆豆腐", 18));
dishList.add(new Dish(9, "干煸豆角", 28));
dishList.add(new Dish(10, "干鍋娃娃菜", 29));
dishList.add(new Dish(11, "干鍋土豆絲", 28));
dishList.add(new Dish(12, "清炒時蔬", 25));
dishList.add(new Dish(13, "涼拌黃瓜", 10));
dishList.add(new Dish(14, "胡椒皮蛋", 15));
dishList.add(new Dish(15, "紅燒茄子", 20));
return dishList;
}
展示菜品列表
初始化菜單后,把整個菜單展示給顧客看。
/**
* 展示菜單
*
* @param dishList 菜品列表
*/
public void showMenu(List<Dish> dishList) {
System.out.println("------------本店菜單------------");
System.out.println("序號\t\t菜名\t\t\t\t單價");
for (int i = 0; i < dishList.size(); i++) {
System.out.format("%d\t\t%s\t\t\t%.2f\n", dishList.get(i).getId(), dishList.get(i).getName(), dishList.get(i).getPrice());
}
System.out.println("---------------------------");
}
展示已點菜品
/**
* 查看已點的菜
*/
public void showOrderedMenu(List<Dish> orderedList) {
if (orderedList.isEmpty()) {
System.out.println("當(dāng)前您還未點餐,請重新輸入選擇");
} else {
System.out.println("當(dāng)前您點的菜品如下");
for (int i = 0; i < orderedList.size(); i++) {
System.out.println(orderedList.get(i).getName());
}
}
}
移除菜品
找到對應(yīng)序號對應(yīng)的菜品,然后將其移除。
/**
* 刪除對應(yīng)菜品
*
* @param id 菜品對應(yīng)序號
* @param dishList 菜品列表
* @param orderedList 已點菜品列表
*/
public void deleteDish(int id, List<Dish> dishList, List<Dish> orderedList) {
if (!orderedList.isEmpty()) {
orderedList.remove(dishList.get(id - 1));
}
}
結(jié)賬
先判斷是否點菜,如果沒有則提示,若已經(jīng)點過餐,則直接結(jié)賬。
/**
* 結(jié)賬
*/
public void checkout(List<Dish> orderedList) {
double money = 0.0d;
if (orderedList.isEmpty()) {
System.out.println("當(dāng)前您還未點餐,請重新輸入選擇");
} else {
System.out.println("請稍等,正在結(jié)算中……");
for (int i = 0; i < orderedList.size(); i++) {
money += orderedList.get(i).getPrice();
}
System.out.format("你此次總共消費:¥ %.2f\n", money);
}
}
總程序
好了,實現(xiàn)以上各個模塊功能之后,將其整合到一起,就得到我們最后的總體程序。
各部分的代碼都已經(jīng)貼出來的,不過為了大家更方便,我這這里給出總程序結(jié)構(gòu)。

所有代碼均位于 com.cunyu 包下,然后分別是實體類 Dish、接口類 DishInterface 以及主程序 DishApp。
總結(jié)
好了,以上就是我們點菜系統(tǒng)的實現(xiàn)了。如果你對 Java SE 部分的知識掌握較好的話,這一定不是啥難事,畢竟是個十分簡單的控制臺程序,主要語法熟悉,稍微理理邏輯即可。
好了,今天的內(nèi)容就到此結(jié)束了,如果你有什么好的建議,歡迎留言交流。
最后的最后,貼出本設(shè)計的 Github 倉庫地址:https://github.com/cunyu1943/java-in-actions
有需要的童鞋可以自取,當(dāng)然了,也希望大家給我一個 ? star,滿足一下我這個菜鳥的虛榮心呀 ~ ??????
- END -