2010-04-01 60 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模式結合起來很容易,它將大大減少代碼行數量,並使代碼更容易修改。