目錄
目錄
概述
停車場系統
功能
首頁 後端開發 Golang 系統設計:用 Go 建造自動販賣機

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

Nov 05, 2024 am 08:45 AM

住在日本東京,我周圍都是自動販賣機,提供從熱咖啡到冷飲和零食的各種商品。受到這些標誌性機器的啟發,我決定用 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Debian OpenSSL有哪些漏洞 Debian OpenSSL有哪些漏洞 Apr 02, 2025 am 07:30 AM

OpenSSL,作為廣泛應用於安全通信的開源庫,提供了加密算法、密鑰和證書管理等功能。然而,其歷史版本中存在一些已知安全漏洞,其中一些危害極大。本文將重點介紹Debian系統中OpenSSL的常見漏洞及應對措施。 DebianOpenSSL已知漏洞:OpenSSL曾出現過多個嚴重漏洞,例如:心臟出血漏洞(CVE-2014-0160):該漏洞影響OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻擊者可利用此漏洞未經授權讀取服務器上的敏感信息,包括加密密鑰等。

從前端轉型後端開發,學習Java還是Golang更有前景? 從前端轉型後端開發,學習Java還是Golang更有前景? Apr 02, 2025 am 09:12 AM

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

Beego ORM中如何指定模型關聯的數據庫? Beego ORM中如何指定模型關聯的數據庫? Apr 02, 2025 pm 03:54 PM

在BeegoORM框架下,如何指定模型關聯的數據庫?許多Beego項目需要同時操作多個數據庫。當使用Beego...

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

See all articles