2010-04-01 63 views
12

我刚刚学习GWT,所以我仍然试图理清它的所有怪癖和特征。我正在通过他们给出的例子来说明MVP模式,我几乎可以得到它,除了我想知道一件事情。使用MVP缩放gwt的“联系人”(示例项目)AppController

他们使用的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); 
     } 
    } 
    } 
} 

回答

6

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

但是,新的GWT2 UIBinder和MVP功能的确可以简化事情。实际上上面提到的博客文章的作者写了关于places框架(它是GWT 2.1的一部分)here

0

onValueChange方法应该接收的唯一事件是“视图更改”。考虑到每个条件是1行,它永远不会太大。最后你会很好的使用这种模式。正如Lars所说,将UiBinder与MVP模式结合起来很容易,它将大大减少代码行数量,并使代码更容易修改。