Benvenuti su una pista scivolosa. A questo punto ti sei reso conto che esiste una variazione infinita di tutte le interazioni vista modello. MVC, MVP (Taligent, Dolphin, Passive View), MVVM solo per citarne alcuni.
Il modello Model View Presenter, come la maggior parte dei modelli architettonici, è aperto a molta varietà e sperimentazione. L'unica cosa che tutte le variazioni hanno in comune è il ruolo del presentatore come "intermediario" tra la vista e il modello. I due più comuni sono la vista passiva e il supervisore presentatore / controller - [ Fowler ]. Passive View considera l'interfaccia utente come un'interfaccia molto superficiale tra l'utente e il presentatore. Contiene pochissima o nessuna logica, delegando la stessa responsabilità a un relatore. Supervisore del presentatore / controllercerca di sfruttare l'associazione dei dati integrata in molti framework dell'interfaccia utente. L'interfaccia utente gestisce la sincronizzazione dei dati ma il presentatore / controller interviene per una logica più complessa. In entrambi i casi il modello, la vista e il presentatore formano una triade
Ci sono molti modi per farlo. È molto comune vederlo gestito trattando ogni finestra di dialogo / modulo come una vista diversa. Molte volte esiste una relazione 1: 1 tra visualizzazioni e presentatori. Questa non è una regola dura e veloce. È abbastanza comune che un relatore gestisca più viste correlate o viceversa. Tutto dipende dalla complessità della vista e dalla complessità della logica aziendale.
Per quanto riguarda il modo in cui le visualizzazioni e i presentatori si scambiano un riferimento, a volte viene chiamato cablaggio . Hai tre scelte:
La vista contiene un riferimento al presentatore
Una maschera o una finestra di dialogo implementa una vista. Il modulo ha gestori di eventi che eseguono il delgate a un relatore utilizzando chiamate di funzione dirette:
MyForm.SomeEvent(Sender)
{
Presenter.DoSomething(Sender.Data);
}
Poiché il relatore non ha un riferimento alla vista, la vista deve inviargli i dati come argomenti. Il relatore può comunicare di nuovo alla vista usando le funzioni eventi / callback che la vista deve ascoltare.
Il relatore contiene un riferimento da visualizzare
Nello scenario la vista espone le proprietà per i dati che mostra all'utente. Il relatore ascolta gli eventi e manipola le proprietà nella vista:
Presenter.SomeEvent(Sender)
{
DomainObject.DoSomething(View.SomeProperty);
View.SomeOtherProperty = DomainObject.SomeData;
}
Entrambi hanno un riferimento reciproco formando una dipendenza circolare
Questo scenario è in realtà più facile da lavorare rispetto agli altri. La vista risponde agli eventi chiamando i metodi nel presentatore. Il relatore legge / modifica i dati dalla vista attraverso le proprietà esposte.
View.SomeEvent(Sender)
{
Presenter.DoSomething();
}
Presenter.DoSomething()
{
View.SomeProperty = DomainObject.Calc(View.SomeProperty);
}
Vi sono altri problemi da considerare con i modelli MVP. Ordine di creazione, durata dell'oggetto, luogo in cui avviene il cablaggio, comunicazione tra le triadi MVP ma questa risposta è già cresciuta abbastanza a lungo.