假设我有一个GUI,其中包含多种类型的用户对象查看器。例如,树视图,列表视图和图表视图。这三个视图显示了相同的对象。如果用户从一个视图中删除一个对象,我想触发一个事件来通知另外两个视图。我目前通过在对象本身上公开事件来做到这一点。因此,如果从View 1中删除对象,View 1将在对象上调用delete,然后将向订阅者发送一个事件(所有3个视图)。每个订阅者都有机会取消删除。
我认为有一些问题。如果订户在另一个订阅者已经批准删除后取消删除,那么我必须指示这些订阅者撤消删除。
有没有好的模式来实现这种常见的场景?
答案 0 :(得分:2)
如果要从所有视图中删除对象,或者根本没有视图
如果您始终希望用户能够从自己的视图中删除对象:
答案 1 :(得分:2)
这里的转折是每个订阅者都有机会取消删除。通常情况下,当你使用“查看”和“订阅”这个词时,就意味着你是被动的,只是对你看到的内容作出反应。
这并不意味着你要做的事情是不可能的,但这绝对是棘手的。例如,您可以尝试执行某种两阶段提交,其中标记对象已删除,然后在真正删除对象之前等待所有查看者确认删除。 (这基本上是“询问每个订阅者是否可以删除项目”chelmertz建议的方法。)但是,这意味着您需要确切地知道有多少观众,并且所有观众都需要在完成之前做出回应。删除。你总是有三个观众吗?有两个吗?如果其中一个观看者出现错误怎么办 - 删除失败,或者您是否要继续删除该对象?
事件驱动系统的优点在于您通常不必担心这些问题:您只需对模型进行更改(在这种情况下,删除对象)并触发更改事件。您无需了解有关观看者的任何信息。
所以,如果这是我的系统,我会尝试找出一种方法,只有在将模型应用到模型之前才能取消模型更改,而不是尝试通过以下方式将更改应用于其他视图该模型然后尝试稍后回滚这些更改。