2009-08-23 19 views
48

Qualcuno può spiegare in un modo il più semplice possibile che cosa sia il pattern Model View Presenter? Qual è la differenza con Model View Controller? Qual è il migliore o per quale scopo?Che cos'è Model View Presenter?

risposta

28

Martin Fowler ha una pagina sui modelli di progettazione dell'interfaccia utente, in cui definisce e quindi parla di MVC, MVP e altri modelli.

http://martinfowler.com/eaaDev/uiArchs.html

Per riassumere le differenze, controllori del MVC hanno più controllo sulla interfaccia utente, e gestire gli eventi, mentre un presentatore nel MVP è più passivo, e solo presenta le informazioni tramite l'interfaccia utente.

In generale non c'è molta differenza e spesso la linea tra di loro è sfocata.

+7

In entrambi i casi, sei coinvolto con i modelli, e questo deve essere un buon cosa. –

54

Viewer modello e View controller modello entrambi provano a risolvere lo stesso problema di "separazione delle preoccupazioni".

La differenza principale troverete è che Model View Controller (MVC) è spesso implementata con un po 'accoppiamento tra la vista e qualche modello di qualche tipo - in tal modo una determinata vista è specificamente proposto di fornire una visualizzazione di un determinato oggetto (modello).

Nel modello Model View Presenter generalmente si scopre che il Presenter si occupa di lavorare con il modello e di decidere quali informazioni saranno necessarie per formare una sorta di visualizzazione.

In questo diagramma, frecce rappresentano le dipendenze:

MVC and MVP dependencies

In genere si sente questa discussione modello venire quando si parla del framework ASP.NET MVC, e venire attraverso informazioni per quanto riguarda il modello MVP ed è in esecuzione Web Form di ASP.NET. Nella mia esperienza è comune che si creda che WebForms sia di per sé un framework modellato MVP - questo non è vero. WebForms fa comunque rendono molto facile implementare un modello MVP - la tua miglior risorsa per questo sarebbe di indagare la Software Factory client Web dai Patterns and Practices squadra:

sito

CodePlex: http://www.codeplex.com/websf

Una grande copertura screencast il tema: http://www.pnpguidance.net/Screencast/MVPBundleScreencastWCSFModelViewPresenterDesignPattern.aspx

+0

Non sono sicuro che quelle frecce di dipendenza siano corrette. In MVC, perché la vista ha una dipendenza dal modello? –

+2

Certamente non * deve * essere, tuttavia questa è l'implementazione più comune.Ad esempio, se si utilizza ASP.NET MVC la procedura migliore è rendere la "vista" dipendente da un tipo (creando una vista fortemente tipizzata). Le tipiche implementazioni MVC inviano un modello a una vista, quindi lascia che la vista decida cosa fare con esso (creando così una dipendenza), mentre in MVP la vista chiederà letteralmente al presentatore "Quali dati dovrei inserire in questa casella di testo". – apiguy

+0

Esiste un'ottima implementazione di questo pattern http://www.mvpwebforms.com – hakan

3

Dolphin Smalltalk utilizzato per avere un'implementazione MVC ma successivamente migrato su MVP.

Questo è the technical paper che delinea ciò che hanno fatto e perché.

Il sistema IBM Taligent utilizzava anche MVP: descrivono cosa e perché here.

+0

TwistingTheTriad.PDF link non funziona più. – Xonatron

+1

Sono stati corretti gli URL "Twisting the Triad". – daf

+0

@daf Ero davvero interessato a leggere ma TwistingTheTriad.PDF passa a una pagina vuota attualmente = ( – Coops

4

Fowler separa MVP in 2 modelli: Supervisore Presentatore e Vista passiva.
Aviad Ezra ha un buon articolo su questo argomento http://aviadezra.blogspot.com/2008/10/model-view-presenter-design-pattern.html.
Penso che MVP sia migliore per il desktop e MVC sia per l'app web, perché nel desktop, Model ha la capacità di sollevare l'evento

+0

ho trovato l'articolo di riferimento di Aviad Ezra per essere abbastanza utile per farmi iniziare ad usare il pattern architettonico MVP con la mia applicazione desktop WinForms. il codice di esempio incluso è di facile comprensione – DavidRR

+0

È possibile generare eventi utilizzando chiamate ajax o websocket. In realtà riguarda il lato server. – hakan

Problemi correlati