首頁 > 後端開發 > Golang > 主體

系統設計:用 Go 建造自動販賣機

Patricia Arquette
發布: 2024-11-05 08:45:02
原創
822 人瀏覽過

住在日本東京,我周圍都是自動販賣機,提供從熱咖啡到冷飲和零食的各種商品。受到這些標誌性機器的啟發,我決定用 Go 建造一個自動販賣機系統設計。這是使用狀態模式的一個很酷的範例,我將詳細解釋為什麼它對於此類專案非常有用。

為什麼要使用自動販賣機?

想像一下真正的自動販賣機 - 它實際上非常複雜!它需要:

  • 追蹤產品及其數量
  • 處理金錢
  • 確保您已存入足夠的現金
  • 給你零食
  • 退零錢

另外,它需要在完成所有這些操作時不對其所處的狀態感到困惑。


基本建置模組

首先,我需要一些基本結構來使用:

產品與庫存
每個產品都有 ID、名稱、價格和數量。很簡單的東西:

type Product struct {
    ID       int
    Name     string
    Price    float64
    Quantity int
}
登入後複製

庫存使用地圖追蹤所有產品。它可以:

  • 新增產品
  • 刪除產品
  • 處理交易(例如有人買東西時)
  • 檢查產品是否有庫存

狀態模式:為什麼它在這裡很棒

這就是有趣的地方。自動販賣機可以處於不同的狀態:

  • 等錢
  • 投入金錢
  • 已選擇產品
  • 分配產品

每個狀態都需要以不同的方式處理使用者操作。就像,你不能在投入資金之前就選擇產品,對吧?
我使用了三個主要狀態:

  1. MoneyInsertedState
  2. ProductSelectedState
  3. ProductDispensedState

每個狀態都實作這個介面:

type State interface {
    InsertMoney(amount float64)
    SelectProduct(product *Product)
    ReturnChange()
    DispenseProduct()
}
登入後複製

如何協同工作

假設您想買可樂:

首先,您插入 2.00 美元

  • 機器處於MoneyInsertedState
  • 它記錄了你的錢
  • 切換到 ProductSelectedState

您選擇可樂($1.50)

  • 機器檢查是否有可樂庫存
  • 驗證您投入了足夠的資金
  • 轉到 ProductDispensedState

機器分配你的可樂

  • 更新庫存
  • 退還您的 0.50 美元零錢
  • 返回 MoneyInsertedState

我添加的很酷的功能

  • 庫存管理:每個產品從 3 件開始。當某樣東西售完時,它會自動從可用選項中刪除。
  • 智慧找零處理:機器總是在購買後計算並回傳正確的零錢。
  • 錯誤預防:狀態模式有助於防止奇怪的情況,例如,嘗試在沒有足夠錢的情況下購買東西,選擇缺貨的產品,在分發東西時插入錢。

我學到了什麼

建構這教會了我一些事:

  • 狀態模式非常適合具有清晰、獨特狀態的機器
  • Go 的介面讓狀態模式的實作變得非常乾淨
  • 正確的錯誤處理對於現實世界的應用程式非常重要

接下來是什麼?

總是有進步的空間!一些想法:

  • 新增卡支付支援
  • 實作顯示系統
  • 添加飲料溫度監控
  • 建立用於補貨的管理介面

完整的程式碼比我在這裡展示的更詳細,但這些是使其工作的主要部分。請隨意檢查以下儲存庫中的完整實作:

System design: Building a Vending Machine in Go 主題樹 / 低級設計 golang

Golang 中的底層系統設計問題解決方案

System design: Building a Vending Machine in Go

Go 中的底層系統設計

歡迎來到Go 中的低階系統設計 儲存庫!此儲存庫包含各種低階系統設計問題及其在 Go 中實現的解決方案。主要目的是透過實際範例展示系統的設計和架構。

目錄

  • 概述
  • 停車場系統
  • 電梯系統
  • 圖書館管理系統
  • 自動販賣機系統

概述

底層系統設計涉及理解系統架構的核心概念以及設計可擴展、可維護和高效的系統。該存儲庫將嘗試涵蓋使用 Go 的各種問題和場景的解決方案。

停車場系統

此儲存庫中的第一個項目是停車場系統。該系統模擬一個可以停放車輛和出庫車輛的停車場。它示範了:

  • 用於管理停車場實例的單例設計模式。
  • 處理不同類型的車輛(例如汽車、卡車)。
  • 多個樓層的停車位管理。
  • 停放車輛的付款處理。

功能

在 GitHub 上查看

以上是系統設計:用 Go 建造自動販賣機的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!