为了账号安全,请及时绑定邮箱和手机立即绑定

你将如何持久化一个实现状态设计模式的对象?

你将如何持久化一个实现状态设计模式的对象?

红糖糍粑 2021-06-17 18:19:11
我目前正在制作一个快递服务网页 - 客户可以放弃订单 - 快递可以更改订单的状态(新的,接受的,交付中的,交付的,取消的)。我使用状态设计模式来描述这一点,因为它对我来说最有意义。我想将所有订单保存在关系数据库中(我使用的是 H2 和 Hibernate/JPA) - 但我不知道如何在加载对象时恢复状态。想到了两种方法:为每个状态创建一个表,并将对象保存在与其状态对应的表中(我不知道如何(如果可能的话)实现这一点)。给订单类一个与其所处状态相对应的属性 - 然后在再次加载对象时将对象的内部状态设置为等于相关状态。但这不会破坏状态设计模式的目的吗?目标不是最小化 if/else 语句和开关墙吗?我应该怎么办?有没有更好的方法来解决这个问题?
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

这在很大程度上取决于您的用例。

您是否计划拥有数以百万计的行?那么每个州都有一张桌子实际上是有道理的。这称为分区,通常,您的应用程序不会知道您有一组表。但是你的数据库会。我认为情况并非如此。

第二个选择是声音,如果它是一个玩具项目。状态设计模式的目标不是减少 if/else 语句的数量。根据我的经验,它通常会产生更多的 if/else 语句。目标是封装状态转换。也就是说,在代码周围使用 if/else,很容易将您的订单从 Created 状态移动到 Completed 状态,而实际上它没有被处理。状态设计模式有助于解决这个问题。

但实际上还有第三种选择,通常用于现实生活中的系统。有 OrderStates 表,它将保存订单所在的所有状态。每次订单在状态之间移动时创建一行。这将使您能够真正了解系统中发生的情况。


查看完整回答
反对 回复 2021-06-30
  • 3 回答
  • 0 关注
  • 162 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信