我正在设计一个订单系统,状态设计模式似乎很合适,因为订单可以更改其状态,从而影响订单的可用功能。以下是我的基本类图:
我不喜欢这种方法,因为客户端无法看到方法是否被支持,这违反了Liskov原则。我创建了以下替代方案:
我更喜欢这个方案,但用户仍然需要检查方法是否被支持。但他们仍然可以调用不受支持的方法并获得异常。这是否仍然违反了Liskov原则?
有没有更好的设计符合Liskov原则,并防止用户调用特定状态下的无效方法?
我正在设计一个订单系统,状态设计模式似乎很合适,因为订单可以更改其状态,从而影响订单的可用功能。以下是我的基本类图:
我不喜欢这种方法,因为客户端无法看到方法是否被支持,这违反了Liskov原则。我创建了以下替代方案:
我更喜欢这个方案,但用户仍然需要检查方法是否被支持。但他们仍然可以调用不受支持的方法并获得异常。这是否仍然违反了Liskov原则?
有没有更好的设计符合Liskov原则,并防止用户调用特定状态下的无效方法?
proceedToTheNextState
方法,您可以创建4个状态:确认,取消,支付,发货,这些状态执行与状态相关的所有工作并转换到下一个状态。 - Ihor Burlachenko
OrderStates
将全部实现OrderState
接口,因此它的方法也将被实现。所有这些方法都可能根据接口契约引发异常。因此,您可以用另一个具体的 OrderState 替换任何一个。因此,您不会违反 Liskov 的替换原则。您可以使用相同的模式来绘制按钮。只需将按钮渲染器传递给 OrderState,并从具体的 OrderState 返回正确的按钮,例如,Confirmed 将告诉 ButtonRenderer 渲染一个 Pay 按钮等。 - Gordonadvance()
。 - Gordon