| 項目 | 規格 |
|---|---|
| 介面 | Swing GUI,顯示飲料名稱、價格、庫存、投幣區、找零區、管理員模式切換 |
| 商品 | 可樂、芬達、紅茶、綠茶 (各自價格、庫存可配置) |
| 貨幣 | 僅接受 1 元、5 元硬幣/紙鈔 |
| 用戶模式 | 選擇商品 → 投幣 → 出貨/找零 → 可選退幣 |
| 管理員模式 | 密碼驗證 → 查看總營收/各商品剩餘庫存 → 補貨/加鈔 |
| 持久化 | 檔案/資料庫儲存庫存與營收,重啟不丟失 |
// 領域模型
enum Drink { COKE(5), FANTA(5), BLACK_TEA(4), GREEN_TEA(4); ... }
class Product { Drink type; int price; int stock; }
class CoinHopper { Map<Integer, Integer> count; // 面額->數量
void insert(int denom); int change(int amount); void refill(int denom, int cnt); }
class VendingMachine {
List<Product> products;
CoinHopper hopper;
int balance; // 當前投幣餘額
boolean adminMode;
// 核心操作
boolean select(Drink d);
void insertCoin(int denom);
void refund();
void adminLogin(String pwd);
void restock(Drink d, int cnt);
void addCash(int denom, int cnt);
}
VendingMachine 單例,持有狀態與業務邏輯,提供 PropertyChangeSupport 通知 UI 更新。JFrame 主視窗,包含 JPanel 商品網格 (GridLayout)、投幣面板、訊息顯示區、管理員登入對話框。ActionListener 呼叫 Model 方法,再 SwingUtilities.invokeLater 刷新 View。JOptionPane.showInputDialog 輸入密碼 → 驗證成功 → 開啟 JDialog 顯示統計表格 (JTable) → 提供補貨/加鈔輸入欄 → 確認寫回 Model 與持久化。JSON (Jackson/Gson) 或 Properties 檔案,儲存 Map<Drink, Integer> 库存與 CoinHopper 狀態。products, coins, transactions 資料表。
原答案提到「增加了修改商品數量功能」,符合管理員補貨需求。
這個專案是練習 狀態機設計、事件驅動 GUI、領域模型封裝、持久化策略 的絕佳載體,建議從最簡單的「單一商品、固定價格」開始遞增實作。