2011-01-06 13 views
5

prima volta la pubblicazione di una domanda su StackOverflow, quindi si prega di andare facile su di me :)disaccoppiamento Vista dal controller in Java MVC modello

Da quello che ho capito, uso corretto del pattern Model-View-Controller richiede che disaccoppiare la vista e il controller in modo tale che la vista non sappia nulla sul controller. Sto avendo un po 'di problemi a capire come farlo usando Java Swing.

Dire che ho una vista (qualche classe che estenderebbe JFrame), e questa vista ha un pulsante. È sicuro dire che vorrei registrare il controller come ActionListener del pulsante? O lo faccio diventare un ascoltatore dell'intera vista stessa.

e come posso andare a fare questo senza fare qualcosa di simile:

button.addActionListener (myController)

nella vista, perché se dovessi fare questo nel codice della vista, no ora ha una dipendenza dal controller?

Non ho inserito alcun codice perché, francamente, non ho molto da fare al momento.

qualsiasi aiuto è appreicato!

+0

collegamento alla domanda pertinente su stackoverflow: http://stackoverflow.com/questions/3066590/gui-problem-after-rewriting-to-mvc.Il mio problema principale con MVC è che ci sono così tanti modi per farlo, e mi sono reso conto che la vista e il controller sono generalmente strettamente accoppiati, quindi è davvero compito del programmatore decidere come risolvere le dipendenze. Grazie per tutte le vostre risposte! – Alan

risposta

4

Potrebbe essere utile non pensare alla visualizzazione in termini di pulsanti, ecc. Quanto un'interfaccia. L'interfaccia rende possibile la scrittura di web ui, console a riga di comando, ecc. E adempiere al ruolo della vista.

In caso di evento del pulsante, il pulsante rappresenta una chiamata ad un comando eseguito dal controller.

Quindi, si potrebbe avere un'interfaccia come questa:

public interface MyViewIf { 
    // used by the controller to register its self as a listener of the view 
    public addViewListener(ViewListener vl); 
    ... 
} 

e:

public interface ViewListenerIf { 
    // used by the View to notify any listeners of control events etc. 
    public onViewEvent(ViewEvent ve); 
} 

Poi il controller sarebbe implementare ViewListenerIf e registrarlo è auto con una fabbrica generato istanza di MyViewIf. In questo modo il controllore non ha bisogno di conoscere alcun dettaglio sulle tue classi di visualizzazione.

La classe di visualizzazione gestirà internamente i propri eventi pulsante, li trasformerà in oggetti ViewEvent e chiamerà onViewEvent() sul controller che si è registrato con la vista, lasciando la vista 100% ignaro dell'esistenza del controller.

+0

Un altro commento rapido: è anche possibile sostituire i metodi addViewListener e onViewEvent con una serie di metodi addXXXEventListener più specifici e gli oggetti evento corrispondenti, ecc. Talvolta non è conveniente provare e generare tutti gli eventi Visualizza in un singolo oggetto. – Nick

+0

Grazie! Questo è sicuramente sulla strada di quello che stavo cercando. Puoi elaborare un po 'sugli oggetti ViewEvent. È qualcosa che dovrei codificare da solo, o ci sono classi rilevanti nelle librerie java swing che posso estendere ..? Ho letto su swing nei tutorial di java, quindi se ho perso una spiegazione altrove, potresti semplicemente indicarmi la giusta direzione :) – Alan

+0

Per quanto riguarda cosa usare per la tua classe Event, può essere praticamente tutte le classi, ma ho trovato più veloce scriverle da soli poiché tendono ad essere oggetti molto semplici con campi specifici dell'applicazione. Ad esempio, se la tua vista ha solo bisogno di passare messaggi e non stringhe, array, ecc. Il tuo oggetto ViewEvent potrebbe consistere in un singolo campo int o enum che rappresenta il messageId. – Nick

1

Dai uno sguardo allo Spring Framework per avere una panoramica sull'implementazione del pattern MVC. Breve tutorial Spring Tutorial

+0

Grazie per il link. Lo esaminerò. – Alan

1

Crea un actionlistener nella classe di visualizzazione. Dal tuo actionlistener chiami il controller.

Codice per ActionListener:

controller.doButtonClick(); 

Questo significa che è necessario per iniettare il vostro modello e controller per la vista. È così che lo faccio.

+0

Questo non introduce una dipendenza dal controller dalla vista? Se è così, è accettabile nel pattern MVC? E se no, in che modo, dal momento che ci stiamo effettivamente riferendo al controller dalla vista, solo indirettamente attraverso l'actionlistener? – Alan

+1

Sì, sì. Ma penso che sia ok. Usiamo il pattern mvc per separare l'interfaccia utente dalla logica del dominio. Se avessi intenzione di creare un nuovo interfaccia utente, sarebbe comunque solo il codice di visualizzazione che dovevi modificare. –

+1

Tuttavia, ciò che si potrebbe fare è la chiamata del controllore: getView(). GetButton(). AddActionListener (myControllerButtonActionListener); se ti piace di più Questo non introduce una dipendenza dal controller dalla vista. –

Problemi correlati