我有一个 Order 类,它经历了一系列定义的状态。为了解决这个问题,我实现了 State 模式,使得 Order 对象有一个 CurrentState 成员,该成员实现了 IOrderState 接口。然后我有这个接口的具体实现,例如 OrderStateNew、OrderStateDelivered 等
我的问题是,在状态之间转换 Order 对象的正确方法是什么?有一个允许外部服务设置状态的 Order.SetState() 方法是否可以接受?确定状态更改的标准存储在 Order 对象的外部,因此这似乎是显而易见的答案,但我对在我的对象上使用公共方法来更改像这样基本的东西有点不安。
附加说明 我认为添加更多关于我的实现的细节可能会很有用,因为我想知道我是否首先正确地使用了该模式。这是用于创建和授权订单的公共 API
Dim orderFacade As New OrderFacade
Dim order = orderFacade.createFrom(customer)
' Add lines etc
' This will validate the order and transition it to status 'Authorised'
Dim valid = orderFacade.Authorise(order)
' This will commit the order, but only if it is at status 'Authorised'
Dim result = orderFacade.Commit()
OrderFacade.Authorise() 函数看起来像这样
Public Function Authorise(ByRef originalOrder As Order) As ValidationSummary
If originalOrder.CurrentState.CanAuthorise() Then
Dim validator = OrderValidatorFactory.createFrom(originalOrder)
Dim valid = validator.ValidateOrder(originalOrder)
If valid.IsValid Then
originalOrder.SetOrderStatus(OrderStatus.Authorised)
End If
Return valid
End If
End Function
如您所见,CurrentState 成员是当前 IOrderState 实现,它确定哪些活动对对象有效。我想知道这是否应该负责确定过渡而不是 OrderFacade?