2012-12-08 13 views
3

我試圖首次實現被動視圖的MVP,但我有點困惑誰知道誰在這種模式。我瞭解,如果視圖發生變化,視圖會通知主持人,而主持人會反過來通知其他人(其他視圖和模型)。多視圖MVP:發送正確的事件

現在,在我的情況下,我有多個視圖,並且我也有一個可以在UI之外更改的模型。以下兩種情況可能發生:

  1. 視圖[i]被更改並通知Presenter。演示者需要通知所有其他視圖和模型,但不能查看[i]。此外,無論Views還是Model都不會向Presenter發送更改通知,即使它們只是被修改了(否則將會有無限循環的事件)。

  2. 模型被更改並通知Presenter。演示者需要通知所有視圖,但不是模型。但是,即使視圖剛剛被修改,視圖也不會向Presenter發送更改通知。

主講人如何通知和誰不是?該模型如何知道是否需要發出變更通知?畢竟,它只是被修改了,但它不一定知道誰。

一種可能性是讓每個人(模型,視圖和演示者)自由發送更改通知,而是存儲對最初觸發通知內部更改的對象的引用(從而將通知封裝在事件對象中)。如果他不是變化的原始觸發器,則每個對象僅發送通知。但是有沒有更簡單,更乾淨的方法呢?

回答

1

有幾種方法可以解決這個問題,但我推薦的兩種方法是Mediator Pattern或某種類型的Event Aggregator

Mediator模式背後的想法是,它允許您封裝對象集合應該如何在特定場景中進行交互,同時保持它們彼此無知。

事情是這樣的:

public class MyPresenterOne{ 
    public event EventHandler OnFoo; 
} 

public class MyPresenterTwo{ 
    public void DoStuff(){ 
     //Something interesting 
    } 
} 

public class MyMediator{ 
    public MyMediator(MyPresenterOne p1, MyPresenterTwo p2){ 
     p1.OnFoo += (o, e) => p2.DoStuff(); 
    } 
} 

的事件聚合是一種鬆耦合的發佈/訂閱模式,你是不是真的監聽事件,而是消息。一方對某種類型的消息表示興趣,但並不關心它來自哪裏。

public class MyPresenterOne{ 
    public MyPresenterOne(){ 
     EventAggregator.Publish("OnFoo"); 
    } 
} 

public class MyPresenterTwo{ 
    public MyPresenterTwo(){ 
     EventAggregator.Subscribe("OnFoo",() => { 
     //Something interesting 
     }); 
    } 
} 

中介器實現起來更容易一點,意圖非常清楚,但它確實需要對涉及的各個組件有深入的瞭解。這個想法是讓調解人專注於特定的構圖場景,而不是有一個巨大的調解人。

Pub/Sub範例非常優雅,並且可以很好地保持組件間的鬆散耦合,但需要更多地考慮發佈什麼類型的消息。