首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >状态模式与继承

状态模式与继承
EN

Software Engineering用户
提问于 2014-01-22 10:28:31
回答 1查看 2.4K关注 0票数 5

在下面的图像中显示来自状态模式应用领域驱动设计和模式:以C#和.NET为例

我试图将SalesOrder实体持久化到数据库中。通常,我的数据库中会有一个salesOrder表,其中一个字段currentState指向实体的当前状态。

这个实现很好,因为只有一个实体,并且它的状态只包含不同的行为。

但是,如果我必须跟踪不同州的其他属性呢?示例:

  • 当SalesOrder被取消时,我需要跟踪已取消的quantitycancellationReasoncancelledBycancellationDate
  • 当SalesOrder被退还时,我需要跟踪refundQuantityrefundPricerefundFee

基本上,这就像我有一个CancelledSalesOrderRefundedSalesOrder实体,具有附加的属性。其他州也是如此。

因此,我现在的问题是,我必须将设计从使用状态模式更改为使用继承。但是,继承不允许我在运行时动态更改我的状态(状态图最初解决的问题)。

所以我的问题是:

  1. 当每个状态中的实体都有其他属性时,状态模式会失败吗?还有别的选择吗?
  2. 在这种情况下,我应该如何坚持我的实体?单表继承?每个班的桌子?每个混凝土类的桌子?
  3. 如果我必须维护前一个状态的一些属性(退货订单,但不要从发运状态删除发货地址),那么如何解决这个问题呢?
  4. 你如何跟踪状态发生的顺序?
EN

回答 1

Software Engineering用户

回答已采纳

发布于 2014-01-22 11:57:22

不,状态模式不会失败。只需将附加的“取消”属性作为“取消”状态的一部分,将附加的“退款”属性部分变为“已退”状态(我猜,您只是在图表中忘记了后一种状态吗?)

因为任何"state“实体都是SalesOrder的集合,所以可以看到"state”的任何属性只是对SalesOrder的“添加详细信息”。

您为您的OrderState层次结构选择哪种继承映射实际上与您的问题无关,任何一个典型的三种都可以。

状态模式还允许您保留前一个状态的属性,即使状态随后发生了更改。例如,即使状态从“已发货”更改为“发票”,也可能需要保留“传送地址”。这可以通过同时允许多个状态来解决,只需使SalesOrder和OrderState之间的关系为"1:n“,而不是"1:1”。因此,您不需要“将状态从已发货更改为发票”,而是将附加状态"invoiced“添加到实体"StateOrder”中,而无需事先删除"invoiced“状态。当然,使用此模型时,当查找所有订单要发货时,您不仅必须检查“已批准”的订单,还必须检查“已批准但尚未发货的订单”。但这只是处理过程中的一个细节,不应该太难处理。

拥有多个国家是IMHO的“更好”模式,因为它反映了现实世界的情况更充分。例如,您已经发送和开具发票的东西是“发货和发票”,而不是“发票而不是发货”。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/225037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档