User interface 什么';当用户对象有多个查看器时,实现删除该对象的最佳方法是什么?

User interface 什么';当用户对象有多个查看器时,实现删除该对象的最佳方法是什么?,user-interface,design-patterns,User Interface,Design Patterns,假设我有一个GUI,其中有多种类型的用户对象查看器。例如,树视图、列表视图和图表视图。这三个视图显示相同的对象。如果用户从一个视图中删除一个对象,我想触发一个事件来通知其他两个视图。目前,我通过公开对象本身上的事件来实现这一点。因此,如果从视图1中删除该对象,视图1将调用该对象上的delete,然后将向订阅服务器(所有3个视图)触发一个事件。每个订户都有机会取消删除 在我看来,有几个问题。如果一个订户在另一个订户已经批准删除后取消了删除,那么我必须指示这些订户撤消删除 有什么好的模式来实现这种常

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

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


有什么好的模式来实现这种常见场景吗?

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

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

  • 第二步。从上面开始,加上仅为1)用户删除;或者2)该视图中的用户
  • 第一步。从上面开始,然后继续。。(可能会被跳过,具体取决于您希望视图的连贯程度)

  • 如果要从所有视图中删除对象,或根本不删除任何视图

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

  • 第二步。从上面开始,加上仅为1)用户删除;或者2)该视图中的用户
  • 第一步。从上面开始,然后继续。。(可能会被跳过,具体取决于您希望视图的连贯程度)

  • 这里的转折点是每个订户都有机会取消删除。通常,当你使用“查看”和“订阅”这两个词时,意味着你是被动的,只是对你看到的东西做出反应

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

    事件驱动系统的好处在于,您通常不必担心这些问题:您只需更改模型(在本例中,删除对象)并触发更改事件。你不需要知道任何关于你的观众的事情


    因此,如果这是我的系统,我会尝试找出一种方法,使模型更改仅在应用于模型之前可取消,而不是尝试通过模型将更改应用于其他视图,然后尝试稍后回滚这些更改。

    这里的转折点是,每个订阅者都有机会取消删除。通常,当你使用“查看”和“订阅”这两个词时,意味着你是被动的,只是对你看到的东西做出反应

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

    事件驱动系统的好处在于,您通常不必担心这些问题:您只需更改模型(在本例中,删除对象)并触发更改事件。你不需要知道任何关于你的观众的事情

    因此,如果这是我的系统,我将尝试找出一种方法,使模型更改仅在应用于模型之前可取消,而不是尝试通过模型将更改应用于其他视图,然后尝试稍后回滚这些更改