gpt4 book ai didi

oop - 替代(或改进)遭受 LSP 违规的状态模式

转载 作者:行者123 更新时间:2023-12-04 23:31:14 38 4
gpt4 key购买 nike

对于我们目前正在构建的发票系统,我很难理解基于状态的功能。该系统将支持发票的计算、人工审批、打印和存档。

起初我认为我们应该使用 State Pattern对此进行建模。发票将是上下文,它将打印、归档等委托(delegate)给其当前分配的状态。

但这显然是个坏主意,因为不同的状态(创建、批准、打印、存档)不应该支持相同的操作。例如,您不应该能够打印以前未经批准的发票。为不受支持的操作抛出异常将违反 LSP。我找到了这个问题的一般描述here .

有没有人有想法,如何适本地实现这个?

PS:我知道这听起来像是一些蹩脚的家庭作业,但事实并非如此;我需要这个用于现实世界的系统。

最佳答案

您基本上是在创建应用程序状态的工作流,在每个状态下,发票上的可用操作都会发生变化。状态模式似乎不合适,但如果您还创建了一些操作,例如 boolean canPrint(),您仍然可以使用它。在调用 print() 之前必须使用. print()如果 canPrint() 将有一个允许抛出异常的契约(Contract)返回 false .这样,子类就不会破坏该契约。另一种选择是拥有 boolean tryPrint() ,只有在可以打印的情况下才会打印,并返回是否打印。

但是,如果状态主要支持非重叠操作,那么状态模式可能不是解决方案。退后一步,寻找更好的方法,而不是试图让特定的模式适应你的问题。一种方法是为每个“状态”创建一个具有必要操作的单独类:如 CreatedInvoice , ApprovedInvoice等。这些类只有它们支持的操作。

关于oop - 替代(或改进)遭受 LSP 违规的状态模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11274381/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com