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

我试图将SalesOrder实体持久化到数据库中。通常,我的数据库中会有一个salesOrder表,其中一个字段currentState指向实体的当前状态。
这个实现很好,因为只有一个实体,并且它的状态只包含不同的行为。
但是,如果我必须跟踪不同州的其他属性呢?示例:
quantity、cancellationReason、cancelledBy、cancellationDate。refundQuantity、refundPrice、refundFee。基本上,这就像我有一个CancelledSalesOrder和RefundedSalesOrder实体,具有附加的属性。其他州也是如此。
因此,我现在的问题是,我必须将设计从使用状态模式更改为使用继承。但是,继承不允许我在运行时动态更改我的状态(状态图最初解决的问题)。
所以我的问题是:
发布于 2014-01-22 11:57:22
不,状态模式不会失败。只需将附加的“取消”属性作为“取消”状态的一部分,将附加的“退款”属性部分变为“已退”状态(我猜,您只是在图表中忘记了后一种状态吗?)
因为任何"state“实体都是SalesOrder的集合,所以可以看到"state”的任何属性只是对SalesOrder的“添加详细信息”。
您为您的OrderState层次结构选择哪种继承映射实际上与您的问题无关,任何一个典型的三种都可以。
状态模式还允许您保留前一个状态的属性,即使状态随后发生了更改。例如,即使状态从“已发货”更改为“发票”,也可能需要保留“传送地址”。这可以通过同时允许多个状态来解决,只需使SalesOrder和OrderState之间的关系为"1:n“,而不是"1:1”。因此,您不需要“将状态从已发货更改为发票”,而是将附加状态"invoiced“添加到实体"StateOrder”中,而无需事先删除"invoiced“状态。当然,使用此模型时,当查找所有订单要发货时,您不仅必须检查“已批准”的订单,还必须检查“已批准但尚未发货的订单”。但这只是处理过程中的一个细节,不应该太难处理。
拥有多个国家是IMHO的“更好”模式,因为它反映了现实世界的情况更充分。例如,您已经发送和开具发票的东西是“发货和发票”,而不是“发票而不是发货”。
https://softwareengineering.stackexchange.com/questions/225037
复制相似问题