在有多个对象查看器的情况下,实现删除用户对象的最佳方法是什么?

时间:2010-02-20 23:33:01

标签: user-interface design-patterns

假设我有一个GUI,其中包含多种类型的用户对象查看器。例如,树视图,列表视图和图表视图。这三个视图显示了相同的对象。如果用户从一个视图中删除一个对象,我想触发一个事件来通知另外两个视图。我目前通过在对象本身上公开事件来做到这一点。因此,如果从View 1中删除对象,View 1将在对象上调用delete,然后将向订阅者发送一个事件(所有3个视图)。每个订阅者都有机会取消删除。

我认为有一些问题。如果订户在另一个订阅者已经批准删除后取消删除,那么我必须指示这些订阅者撤消删除。

有没有好的模式来实现这种常见的场景?

2 个答案:

答案 0 :(得分:2)

如果要从所有视图中删除对象,或者根本没有视图

  1. 询问每个订阅者是否可以删除该项目;如果是的话:
  2. 发出“删除项目”调用以从源中删除对象,执行软删除或任何您想要的内容
  3. 更新每个视图。这将是观察者部分,侦听“对象已删除”调用并采取适当的操作,例如从每个视图中手动删除现在删除的对象
  4. 如果您始终希望用户能够从自己的视图中删除对象

    1. 步骤2.从上面开始,另外只删除1)用户;或者2)该视图中的用户
    2. 步骤1.从上面开始,然后继续..(可能会被跳过,具体取决于您希望视图连贯多少)

答案 1 :(得分:2)

这里的转折是每个订阅者都有机会取消删除。通常情况下,当你使用“查看”和“订阅”这个词时,就意味着你是被动的,只是对你看到的内容作出反应。

这并不意味着你要做的事情是不可能的,但这绝对是棘手的。例如,您可以尝试执行某种两阶段提交,其中标记对象已删除,然后在真正删除对象之前等待所有查看者确认删除。 (这基本上是“询问每个订阅者是否可以删除项目”chelmertz建议的方法。)但是,这意味着您需要确切地知道有多少观众,并且所有观众都需要在完成之前做出回应。删除。你总是有三个观众吗?有两个吗?如果其中一个观看者出现错误怎么办 - 删除失败,或者您是否要继续删除该对象?

事件驱动系统的优点在于您通常不必担心这些问题:您只需对模型进行更改(在这种情况下,删除对象)并触发更改事件。您无需了解有关观看者的任何信息。

所以,如果这是我的系统,我会尝试找出一种方法,只有在模型应用到模型之前才能取消模型更改,而不是尝试通过以下方式将更改应用于其他视图该模型然后尝试稍后回滚这些更改。