Il paradigma MVC consiste nel distinguere, all’interno di un sistema informatico, tre tipologie di componenti:
Tale paradigma trova la sua applicazione principale nei programmi con interfaccia grafica (GUI) e nei sistemi con interfaccia web.
Il paradigma detta la distinzione di responsabilità tra le tre categorie e il flusso di informazioni tra di esse.
In particolare:
Consideriamo l’esempio di un editor di pagine HTML
La figura a destra mostra il flusso di messaggi tipico del paradigma MVC.
Notiamo che il controller, ricevendo un evento dalla GUI, come l’inserimento di un carattere da parte dell’utente, effettua una modifica del Model.
Il pattern STRATEGY si occupa essenzialmente di quelle situazioni in cui una classe prende una procedura come argomento.
In un linguaggio orientato agli oggetti, questa procedura deve presentarsi sotto forma di oggetto di una apposita classe.
Contesto:
Soluzione:
La figura a destra rappresenta il diagramma delle classi UML proprio del pattern STRATEGY.
Come si vede, in questo caso il diagramma aggiunge ben poco alla descrizione della soluzione.
Il metodo doWork, il cui nome, come sempre, è puramente convenzionale, rappresenta il punto di accesso all’algoritmo.
Anche se non è mostrato dal diagramma, la classe Context deve avere un metodo per accettare un oggetto di tipo Strategy.
Abbiamo già incontrato un esempio di applicazione del pattern STRATEGY: nella scelta del layout di un componente grafico Swing/AWT.
Dalla lezione precedente, ricordiamo che per impostare la disposizione degli elementi grafici all’interno di un contenitore, si utilizza una chiamata del tipo:
contentPane.setLayout(new GridLayout(2,2));
L’oggetto anonimo di tipo GridLayout rappresenta proprio la disposizione che si intende dare a questo pannello: in questo caso, una griglia di due righe e due colonne.
Oltre a GridLayout, la libreria standard fornisce altre classi di layout, come BoxLayout e FlowLayout:
Tutte le classi di layout implementano l’interfaccia LayoutManager, i cui metodi principali sono i seguenti:
A questo punto, è facile vedere che siamo in presenza di un’applicazione del pattern Strategy, come evidenziato dalla slide successiva.
La figura a destra mostra il rapporto tra le classi coinvolte nella scelta di un layout per un contenitore Swing/AWT.
La classe Container ha un metodo per impostare un layout, il cui argomento è di tipo LayoutManager:
L’interfaccia LayoutManager offre diversi metodi, legati alla realizzazione di un particolare layout:
Infine, GridLayout è un esempio di classe concreta che implementa l’interfaccia.
Esaminiamo un’altra applicazione di STRATEGY che ritroviamo nella libreria standard.
La classe java.util.Collections contiene alcuni metodi di utilità, tra cui uno che permette di ordinare una lista di oggetti.
static void sort(List l, Comparator c)
Questo metodo ordina la lista l, con il mergesort, utilizzando l’oggetto di tipo Comparator per effettuare i confronti tra gli oggetti presenti nella lista.
Quindi, l’interfaccia Comparator ricopre il ruolo di Strategy e sort è l’algoritmo che la utilizza.
Proponiamo un esercizio piuttosto articolato, che permette di approfondire e mettere in pratica le nozioni apprese relativamente alle interfacce grafiche.
Scopo: realizzare un’applicazione per lo studio di funzioni parametriche di una variabile reale.
Ad esempio, parabole:
a x2 + b x + c
con variabile x e parametri a, b, c.
L’aspetto dovrebbe essere simile alla figura a destra.
Il primo pannello rappresenta il grafico della funzione in esame sul piano cartesiano.
Il secondo pannello presenta il valore della funzione per alcuni valori della sua incognita.
Il terzo pannello permette di modificare i parametri della funzione, entro un certo intervallo (ad es., da -10 a 10).
Cambiando i parametri, vengono immediatamente aggiornati i primi due pannelli.
Seguire il più possibile il framework MVC ed il pattern Observer.
In questo caso, il framework MVC si coniuga così:
Progettare l’applicazione in modo che possa funzionare con diverse tipologie di funzioni parametriche.
Ad esempio, basare l’applicazione su un’interfaccia che rappresenta una generica funzione parametrica:
Mostra codiceLe classi che gestiscono le viste e i controller manipolano generici oggetti di tipo PFunction.
L'applicazione istanzia oggetti (un oggetto?) di tipo Parabola, che è una classe che implementa PFunction.
4. Risoluzione dell'overloading e dell'overriding
5. Controllo di uguaglianza tra oggetti
6. Classi interne, locali ed anonime
7. Iteratori, teoria e pratica
8. Clonazione di oggetti. Confronto tra oggetti.
9. Elementi di programmazione di interfacce grafiche
10. Il paradigma Model-View-Controller. Il pattern Strategy
11. I pattern Composite e Decorator
12. I pattern Template Method e Factory Method
13. Classi e metodi parametrici
14. La libreria Java Collection Framework: le interfacce Iterable, ...
15. La libreria Java Collection Framework: la classe HashSet e le l...
16. Parametri di tipo con limiti
17. L'implementazione della programmazione generica: la cancellazio...
18. La riflessione
19. Introduzione al multi-threading
22. Classi enumerate