2013-09-29 127 views
0

我在評估是否CDI事件可能對我的新應用程序有意義。到目前爲止,我一直使用MVP體系結構,其中View僅具有UI元素,並將它們公開在公共getter中,而Presenter註冊會單擊它們上的偵聽器。MVP - 註冊點擊監聽器或使用CDI事件?

我來到CDI Events左右,想直接點擊View類中的點擊事件,並且在我的Presenters中只有observe這些事件。

你能告訴我哪種方法更好嗎?或者你爲什麼總體上選擇了另一種方法?

MVP

class LoginView { 
    private Button loginButton; 

    public void getButton() { 
     return loginButton; 
    } 
} 


class LoginPresenter { 
    @Inject 
    private LoginView view; 

    public LoginPresenter() { 
     view.getButton.addClickListener(new ClickListener() { 
      @Override 
      public void buttonClick(ClickEvent event) { 
       //perform the login business logic 
      } 
     }); 
    } 
} 

CDI活動

class LoginView { 
    private Button loginButton; 

    @Inject 
    private Events<LoginEvent> events; 

    public LoginView() { 
     loginButton.addClickListener(new ClickListener() { 
      @Override 
      public void buttonClick(ClickEvent event) { 
       events.fire(new LoginEvent("login")); 
      } 
     }); 
    } 
} 


class LoginPresenter { 
    private void listenLogin(@Observes LoginEvent evt) { 
     //perform the login business logic 
    } 
} 

class LoginEvent extends EventObject { 
    public LoginEvent(String source) { 
     super(); 
    } 
} 

(本例使用Vaadin,但框架的選擇不應該的問題,我一般問題)

要我的主要區別是:CDI不需要用戶界面的getter,也不需要查看成員變量e發言人。缺點是,我需要爲每個要觸發的事件創建一個額外的事件類。

回答

3

那麼,一個事件對象將是一種方式。另一個簡單的方法就是使用一個限定符和你想觀察的字符串值。

@Inject 
@Presenter("loginView") 
private Event<Object> viewEvent; 

public void onLoginView(@Observes @Presenter("loginView") Object viewEvent) { 
    ... whatever has to happen 
} 

這對你的工作等價嗎?

否則,這是一個相當不錯的模式。尼斯方式保持您的應用程序解耦。

+0

原來,我正在尋找。 – membersound

5

就我個人而言,我不使用CDI事件將視圖中的事件發送給其演示者。演示者和視圖之間可以直接相互引用,這意味着與直接調用方法相比,CDI事件只會導致額外的代碼和性能開銷。當您想要解耦您的代碼時,CDI事件非常有用,例如,它們適用於跨視圖通信。作爲一個方面說明,我傾向於將所有com.vaadin導入遠離演示者,在您的情況下,這意味着該視圖將實現ClickListener,並且演示者將具有諸如loginButtonClicked()這樣的方法 - 當ClickEvent發生時,視圖會調用該方法。這樣我就可以在不影響演示者的情況下更改視圖的實現。如果你認爲這是一種好的或不好的做法,這可能是品味的問題。通常,這種方法的辯護是讓演示者清理視圖實現特定的技術使我們能夠重複使用演示者,即使在用其他技術實現視圖時也是如此,但我認爲這頗具學術性。我得到的好處是,在爲演示者進行單元測試時,我不需要模擬Vaadin組件。

+0

這是一個非常有趣的方法!到目前爲止,我總是試圖讓主持人的參考脫離視圖,因爲總的來說,視圖應該只知道UI,而不是關於模型或視圖。但是你寫的東西,特別是關於UI的實現,是非常有意義的! – membersound

+0

在某些情況下,您不希望演示者直接引用視圖實現(例如,如果您針對同一視圖有多個不同的實現,例如桌面和移動實現),那麼您應該抽象視圖主持人在界面後面的參考。 –

+0

如何修改視圖中的組件(例如基於表單中的用戶輸入啓用/禁用按鈕)。你會做視圖本身的用戶輸入驗證和禁用嗎?因爲:如果您從演示者執行這些操作,則會產生循環依賴關係:該視圖具有對演示者的引用,以便在單擊按鈕時調用其方法;並且演示者參考訪問按鈕組件的視圖。 – membersound