0

我一直在看本教程 https://developers.google.com/web-toolkit/articles/mvp-architecture 我想知道的是,这种 MVP 风格每次用户更改页面时效率如何,并且创建 Presenter 的新实例。如果主持人是单身人士会更好吗?我的最终目标是使用 PhoneGap 部署一个应用程序,这样任何性能提升都会很有用。

4

3 回答 3

0

这完全取决于您的实施。

如果您希望将状态保存在您的视图中,您可以使用单例演示者/视图。

它更有效,因为您不需要重新初始化视图,但如果另一个视图上的某些事务进行了需要更改第一个视图的更改,则效率会降低。在这种情况下,您需要在第二个演示者中引发一个事件,该事件被第一个演示者捕获并相应地修改视图。这使应用程序的可预测性降低了一些。

因此,如果每个演示者/视图都是独立的,则需要做一个单独的视图/演示者。

在任何其他情况下,我都会使用新的演示者/视图来重新初始化视图使用的表单中的数据。

请记住,虽然每个使用应用程序范围变量(例如事件总线)的新演示者都不会被破坏(垃圾收集),这将导致以下问题:

每当您加载视图并引发在相应演示者中捕获的事件时,该事件和所有计算都将发生与生成新演示者/视图一样多的次数。

示例: -Presenter1/View1 已加载并捕获某些事件 -Presenter2/View2 已加载 -Presenter1(新实例)/View1(新实例)已加载并捕获某些事件。-事件通过全局事件总线引发 -Presenter1 捕获事件 -Presenter1(新实例)捕获事件

因此,本质上(这不是规则),新的演示者为 GWT 应用程序提供了一个具有完整回发感觉的网页,而在另一种情况下,您拥有加载现有表单的桌面应用程序感觉。

希望这可以帮助。

于 2013-01-17T10:25:24.987 回答
0

不要使用单例...糟糕!

如果您懒惰地初始化演示者并保存它们的引用以供重用,则不必每次都创建一个新实例。

看一下我从https://developers.google.com/web-toolkit/articles/mvp-architecture-2#code_splitting获取和修改的以下示例,以突出显示如何重用演示者,类似于重用视图的方式.

 public void onValueChange(ValueChangeEvent<String> event) {
    String token = event.getValue();

    if (token != null) {
      if (token.equals("list")) {
        GWT.runAsync(new RunAsyncCallback() {
          ...
          public void onSuccess() {
            // lazily initialize our views and presenters, and keep them around to be reused
            if (contactsView == null) {
              contactsView = new ContactsViewImpl<ContactDetails>();
            }
            if (contactsPresenter == null) {
              contactsPresenter = new ContactsPresenter(rpcService, eventBus, contactsView);
            }
            contactsPresenter.go(container);
          }
        });
      }
      ...
   }

除了通过 RunAsyncCallback 进行代码拆分的性能优势之外,本质上,您可以将每个 Presenter 引用为 AppController 类字段,并在切换历史令牌时重用它们。

于 2013-01-19T01:52:23.430 回答
0

我建议您使用gwt-platform。我在几个项目中使用它并且从未遇到任何性能问题。它非常强大,可以帮助您构建应用程序,以便将来更轻松地扩展它,同时保持良好的性能。

于 2013-01-20T12:51:22.817 回答