Nella mia esperienza, in un tradizionale programma di gui desktop mvc desktop, il controller finisce spaccato nella vista. La maggior parte delle persone non si prende il tempo di scomporre una classe di controller.
Modelli di progettazione in Smalltalk MVC
La triade di classi Model / View / Controller (MVC) [KP88] viene utilizzata per creare interfacce utente in Smalltalk-80. Guardare i modelli di progettazione all'interno di MVC dovrebbe aiutarti a capire cosa intendiamo con il termine "modello".
MVC è costituito da tre tipi di oggetti. Il modello è l'oggetto dell'applicazione, la vista è la presentazione dello schermo e il controller definisce il modo in cui l'interfaccia utente reagisce all'input dell'utente. Prima di MVC, i design dell'interfaccia utente tendevano a raggruppare questi oggetti insieme. MVC li disaccoppia per aumentare la flessibilità e il riutilizzo.
MVC disaccoppia le viste e i modelli stabilendo un protocollo di sottoscrizione / notifica tra di loro. Una vista deve garantire che il suo aspetto rifletta lo stato del modello. Ogni volta che i dati del modello cambiano, il modello notifica le viste che dipendono da esso. In risposta, ogni vista ha l'opportunità di aggiornarsi. Questo approccio consente di collegare più viste a un modello per fornire presentazioni diverse. È inoltre possibile creare nuove viste per un modello senza riscriverlo.
Il diagramma seguente mostra un modello e tre viste. (Abbiamo lasciato fuori i controller per semplicità.) Il modello contiene alcuni valori di dati e le viste che definiscono un foglio di calcolo, un istogramma e un grafico a torta mostrano questi dati in vari modi. Il modello comunica con le sue viste quando i suoi valori cambiano e le viste comunicano con il modello per accedere a questi valori.
Preso al valore nominale, questo esempio riflette un design che disaccoppia le viste dai modelli. Ma il design è applicabile a un problema più generale: il disaccoppiamento degli oggetti in modo che le modifiche a uno possano influenzare un numero qualsiasi di altri senza che l'oggetto modificato conosca i dettagli degli altri. Questo design più generale è descritto dal modello di design Observer (pagina 293).
Un'altra caratteristica di MVC è che le viste possono essere nidificate. Ad esempio, un pannello di controllo di pulsanti potrebbe essere implementato come una vista complessa contenente viste di pulsanti nidificati. L'interfaccia utente per una finestra di ispezione oggetto può essere costituita da viste nidificate che possono essere riutilizzate in un debugger. MVC supporta le visualizzazioni nidificate con la classe CompositeView, una sottoclasse di View. Gli oggetti CompositeView si comportano esattamente come gli oggetti Visualizza; una vista composita può essere utilizzata ovunque sia possibile utilizzare una vista, ma contiene anche e gestisce viste nidificate.
Ancora una volta, potremmo pensare a questo come a un design che ci consente di trattare una vista composita proprio come trattiamo uno dei suoi componenti. Ma il design è applicabile a un problema più generale, che si verifica ogni volta che vogliamo raggruppare oggetti e trattare il gruppo come un singolo oggetto. Questo design più generale è descritto dal modello di design composito (163). Ti consente di creare una gerarchia di classi in cui alcune sottoclassi definiscono oggetti primitivi (ad es. Button) e altre classi definiscono oggetti compositi (CompositeView) che assemblano le primitive in oggetti più complessi.
MVC consente inoltre di modificare il modo in cui una vista risponde all'input dell'utente senza modificarne la presentazione visiva. Potresti voler cambiare il modo in cui risponde alla tastiera, per esempio, o fargli usare un menu a comparsa invece dei tasti di comando. MVC incapsula il meccanismo di risposta in un oggetto Controller. Esiste una gerarchia di classi di controller, che semplifica la creazione di un nuovo controller come variazione rispetto a uno esistente.
Una vista utilizza un'istanza di una sottoclasse del controller per implementare una particolare strategia di risposta; per implementare una strategia diversa, è sufficiente sostituire l'istanza con un diverso tipo di controller. È anche possibile cambiare il controller di una vista in fase di esecuzione per consentire alla vista di cambiare il modo in cui risponde all'input dell'utente. Ad esempio, una vista può essere disabilitata in modo che non accetti l'input semplicemente assegnandogli un controller che ignori gli eventi di input.
La relazione View-Controller è un esempio del modello di progettazione Strategy (315). Una strategia è un oggetto che rappresenta un algoritmo. È utile quando si desidera sostituire l'algoritmo staticamente o dinamicamente, quando si hanno molte varianti dell'algoritmo o quando l'algoritmo ha strutture di dati complesse che si desidera incapsulare.
MVC utilizza altri modelli di progettazione, ad esempio Metodo di fabbrica (107) per specificare la classe controller predefinita per una vista e Decorator (175) per aggiungere lo scorrimento a una vista. Ma le principali relazioni in MVC sono date dai modelli di progettazione Observer, Composite e Strategia.