使用MVP扩展gwt的“Contacts”(示例项目)AppController

时间:2010-04-01 14:30:33

标签: java gwt mvp gwt-mvp

我只是在学习GWT,所以我仍然试图理清它的所有怪癖和特征。我正在阅读他们给出的描述MVP模式的例子,我几乎得到它,除了我想知道一件事。

他们使用的AppController实现了ValueChangeHandler接口,并且在历史记录更改时触发onValueChange方法。

我的问题在于AppController中的onValueChange(我已经将它包含在下面,对于那些没有看过示例项目的人来说)。它正在对发送的历史记录进行字符串比较,并实例化相应的演示者以处理该操作。对于具有3个动作的示例应用程序来说,这一切都很好,但是如何将其扩展为具有更多操作的真实应用程序?

坚持这种模式会导致一个非常大/丑陋的else if,但我仍然对GWT(和java)来说太新了,无法为更大的应用程序推断出更好的模式。

非常感谢任何帮助!

public class AppController implements Presenter, ValueChangeHandler<String> {

  ...

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

    if (token != null) {
      Presenter presenter = null;

      if (token.equals("list")) {
        presenter = new ContactsPresenter(rpcService, eventBus, new ContactsView());
      }
      else if (token.equals("add")) {
        presenter = new EditContactPresenter(rpcService, eventBus, new EditContactView());
      }
      else if (token.equals("edit")) {
        presenter = new EditContactPresenter(rpcService, eventBus, new EditContactView());
      }

      if (presenter != null) {
        presenter.go(container);
      }
    }
  } 
}

2 个答案:

答案 0 :(得分:6)

您使用大规模GWT应用程序提出有效点。我最近在50.000+线GWT门户应用程序上工作,我们被埋没在事件和复杂的开关/处理程序模式中。有一篇很好的博客文章here描述了这可能会变得多么糟糕,并暗示一个解决方案(参见可怕的脚注)。

然而,新的GWT2 UIBinder和MVP功能确实简化了事情。事实上,上述博客文章的作者撰写了关于places框架(GWT 2.1的一部分)here的文章。

答案 1 :(得分:0)

onValueChange方法应该接收的唯一事件是“视图更改”。考虑到每个条件是1行,它永远不会那么大。最后,你可以使用这种模式。

正如Lars所说,将UiBinder与MVP模式相结合很容易,并且会大大减少代码行数并使代码更容易修改。