住在日本东京,我周围都是自动售货机,提供从热咖啡到冷饮和零食的各种商品。受到这些标志性机器的启发,我决定用 Go 构建一个自动售货机系统设计。这是使用状态模式的一个很酷的示例,我将详细解释为什么它对于此类项目非常有用。
为什么要使用自动售货机?
想象一下真正的自动售货机 - 它实际上非常复杂!它需要:
- 跟踪产品及其数量
- 处理金钱
- 确保您已存入足够的现金
- 给你零食
- 退回零钱
另外,它需要在完成所有这些操作时不对其所处的状态感到困惑。
基本构建模块
首先,我需要一些基本结构来使用:
产品和库存
每个产品都有 ID、名称、价格和数量。非常简单的东西:
type Product struct { ID int Name string Price float64 Quantity int }
库存使用地图跟踪所有产品。它可以:
- 添加新产品
- 删除产品
- 处理交易(比如有人买东西时)
- 检查产品是否有货
状态模式:为什么它在这里很棒
这就是有趣的地方。自动售货机可以处于不同的状态:
- 等钱
- 投入金钱
- 已选择产品
- 分配产品
每个状态都需要以不同的方式处理用户操作。就像,你不能在投入资金之前选择产品,对吧?
我使用了三个主要状态:
- MoneyInsertedState
- ProductSelectedState
- ProductDispensedState
每个状态都实现这个接口:
type State interface { InsertMoney(amount float64) SelectProduct(product *Product) ReturnChange() DispenseProduct() }
如何协同工作
假设您想买可乐:
首先,您插入 2.00 美元
- 机器处于MoneyInsertedState
- 它记录了你的钱
- 切换到 ProductSelectedState
您选择可乐($1.50)
- 机器检查是否有可乐库存
- 验证您投入了足够的资金
- 转到 ProductDispensedState
机器分配你的可乐
- 更新库存
- 退还您的 0.50 美元零钱
- 返回 MoneyInsertedState
我添加的很酷的功能
- 库存管理:每个产品从 3 件开始。当某样东西售完时,它会自动从可用选项中删除。
- 智能找零处理:机器总是在购买后计算并返回正确的零钱。
- 错误预防:状态模式有助于防止奇怪的情况,例如,尝试在没有足够钱的情况下购买东西,选择缺货的产品,在分发东西时插入钱。
我学到了什么
构建这个教会了我一些事情:
- 状态模式非常适合具有清晰、独特状态的机器
- Go 的接口使状态模式的实现变得非常干净
- 正确的错误处理对于现实世界的应用程序非常重要
接下来是什么?
总是有改进的空间!一些想法:
- 添加卡支付支持
- 实现显示系统
- 添加饮料温度监控
- 创建用于补货的管理界面
完整的代码比我在这里展示的更详细,但这些是使其工作的主要部分。请随意检查以下存储库中的完整实现:
主题树
/
低级设计 golang
Golang 中的底层系统设计问题解决方案
Go 中的底层系统设计
欢迎来到Go 中的低级系统设计 存储库!该存储库包含各种低级系统设计问题及其在 Go 中实现的解决方案。主要目的是通过实际示例展示系统的设计和架构。
目录
- 概述
- 停车场系统
- 电梯系统
- 图书馆管理系统
- 自动售货机系统
概述
底层系统设计涉及理解系统架构的核心概念以及设计可扩展、可维护和高效的系统。该存储库将尝试涵盖使用 Go 的各种问题和场景的解决方案。
停车场系统
此存储库中的第一个项目是停车场系统。该系统模拟一个可以停放车辆和出库车辆的停车场。它演示了:
- 用于管理停车场实例的单例设计模式。
- 处理不同类型的车辆(例如汽车、卡车)。
- 多个楼层的停车位管理。
- 停放车辆的付款处理。
功能
…以上是系统设计:用 Go 构建自动售货机的详细内容。更多信息请关注PHP中文网其他相关文章!

本文演示了创建模拟和存根进行单元测试。 它强调使用接口,提供模拟实现的示例,并讨论最佳实践,例如保持模拟集中并使用断言库。 文章

本文探讨了GO的仿制药自定义类型约束。 它详细介绍了界面如何定义通用功能的最低类型要求,从而改善了类型的安全性和代码可重复使用性。 本文还讨论了局限性和最佳实践

本文使用跟踪工具探讨了GO应用程序执行流。 它讨论了手册和自动仪器技术,比较诸如Jaeger,Zipkin和Opentelemetry之类的工具,并突出显示有效的数据可视化

本文讨论了GO的反思软件包,用于运行时操作代码,对序列化,通用编程等有益。它警告性能成本,例如较慢的执行和更高的内存使用,建议明智的使用和最佳

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A

本文讨论了通过go.mod,涵盖规范,更新和冲突解决方案管理GO模块依赖关系。它强调了最佳实践,例如语义版本控制和定期更新。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能