2010-11-07 39 views
3

我將每個MVP三元組視爲一個孤立的組件。例如,View實現了一個IView接口,當然,Presenter只知道View到IView。被動視圖模式:組件之間的通信

我可以使組件儘可能重用。 現在我必須結合這些MVP組件來組成一個應用程序。我想知道好的做法是保持這些組件儘可能分離。但我當然需要讓他們相互溝通/作出反應。

我可以讓IView暴露給對方的演示者嗎?或者我應該讓演示者在不知道底層視圖的情況下相互溝通?

謝謝

回答

3

在MVP中,我將主持人視爲活動的編排者。因此,它們是構建應用程序基礎的自然選擇。

向其他演示者展示演示者的視圖打破了MVP模式內封裝的想法。雖然它不會降低暴露其視圖的組件的可重用性,但它會降低使用另一個組件視圖的組件的可重用性,因爲它會增加組件依賴性。

所以我會保持對演講者隱私的意見,只讓演示者互相溝通。


迴應置評

當我說保持視圖私有的主持人,我的意思是私人:不暴露在外界,除非通過主持人的調解。當然,主持人可以將方法暴露給外部世界,這會導致它操縱其觀點。如果主持人通過一個接口來實現這一點,那麼它可能實際上使用它自己的視圖作爲接口實現的委託,但是與提議中的相反,主持人將視角委託給視圖而不是相反。

這樣做確保或至少使所有交互邏輯保留在演示者中的可能性更大,並且不會在演示者和視圖中亂丟垃圾。

視圖只能由其演示者操縱。當然,您現在可以在多個演示者中重複使用視圖,但視圖的實例只能由實例化它的演示者操縱。如果直接暴露它(甚至通過整個或部分接口),您就必須處理可由多個演示者操縱的視圖,並且不再有單個演示者控制該視圖。

我在視圖中唯一的代碼是向其演示者通知用戶做了什麼(在一些MVP討論中也稱爲用戶手勢)。由主持人決定如何處理。我還保留關於哪些控件啓用/禁用的所有邏輯,以響應演示者中的用戶選擇而不是視圖中的用戶選擇。這不僅保留了演示者中的所有交互邏輯,而且還有助於創建單元可測試的用戶界面(表單)。

+0

你能詳細解釋一下嗎?我假設你的意思是通過界面暴露演示者。該接口應該只包含與外部與視圖交互相關的方法/事件。有了這個功能,我可以將由View實現的IView界面分成兩部分:一部分是演示者專用,另一部分是演示者暴露在外。現在,演示者可以實現相同的公共接口併成爲其視圖的代表。或者它可以通過分割界面返回View。 – user129148 2010-11-07 17:46:47

+0

這很有道理!謝謝 – user129148 2010-11-07 23:44:38

0

編排演示者的一個好習慣是使用事件總線。主持人登記到公共汽車並聽取他們需要做出反應的事件。 其他演示者在公交車上放置事件以讓可能的目標知道,他們剛剛做了什麼 。 這些消息應該基於問題域,而不是技術 (例如「產品123創建」)

一個good example是GWT MVP架構 和the newer version