首页 >后端开发 >Golang >系统设计:用 Go 构建自动售货机

系统设计:用 Go 构建自动售货机

Patricia Arquette
Patricia Arquette原创
2024-11-05 08:45:02926浏览

住在日本东京,我周围都是自动售货机,提供从热咖啡到冷饮和零食的各种商品。受到这些标志性机器的启发,我决定用 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