74
Esercitazione sui Design Pattern

Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

  • Upload
    others

  • View
    14

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esercitazione sui Design Pattern

Page 2: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Pattern Creazionali

Page 3: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Singleton

• Permette la creazione di una sola istanza della classe all’interno dell’applicazione

• Fornisce un metodo con cui ottenere l’istanza

• Il costruttore della classe non deve essere accessibile

Page 4: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Singleton

public class Logger { private final static Logger logger = new Logger();

private Logger() {}

public static Logger getInstance() { return logger; } public void log(Object o){}}

Page 5: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Singleton

public class Logger { private final static Logger logger = new Logger();

private Logger() {}

public static Logger getInstance() { return logger; } public void log(Object o){}}

Istanza e costruttore

privati

Page 6: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Singleton

public class Logger { private final static Logger logger = new Logger();

private Logger() {}

public static Logger getInstance() { return logger; } public void log(Object o){}}

Istanza e costruttore

privati

Metodo statico per accedere all’istanza

Page 7: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Singleton

public class Logger { private final static Logger logger = new Logger();

private Logger() {}

public static Logger getInstance() { return logger; } public void log(Object o){}}

Istanza e costruttore

privati

Metodo statico per accedere all’istanza

Metodi dell’istanza

Page 8: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Note

• Non deve essere usato per avere un riferimento globale a un oggetto.

• Vanno bene per creare oggetti ma non per accedervi

• Usatelo solo quando serve davvero!

• E se in futuro volessimo avere più istanze?

Page 9: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Factory

• Disaccoppia la creazione degli oggetti dall’invocazione del costruttore

• Permette di avere una logica che seleziona il tipo dinamico della nuova istanza

• Utili quando ci interessa avere una classe che implementi una certa interfaccia ma non ci interessa quale sia nello specifico

Page 10: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esempio

• Abbiamo diversi tipi di bottoni, ciascuno specifico per un particolare sistema operativo

• A noi interessa solamente che venga costruito un bottone

• Vogliamo gestire nel modo più pulito possibile la creazione del bottone

Page 11: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Soluzione ‘brutta’

• Creazione della nuova istanza gestita dal chiamante

• La logica di creazione dell’oggetto viene mischiata con quella del suo utilizzo

• Possibili duplicazioni di codice. Va ripetuto ogni volta che ci serve un bottone

Page 12: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Factory

• La factory si occupa di istanziare il bottone del tipo corretto

• Possiamo separare il codice di selezione dell’istanza e quello che deve ‘usarla’

Page 13: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

public class ButtonFactory { private final SupportedOperatingSystems os; public ButtonFactory(SupportedOperatingSystems os){ this.os = os; } public Button createButton() { switch (os) { case Windows: return new WindowsButton(); case Linux: return new LinuxButton(); } return null; }}

Factory

Page 14: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

public class ButtonFactory { private final SupportedOperatingSystems os; public ButtonFactory(SupportedOperatingSystems os){ this.os = os; } public Button createButton() { switch (os) { case Windows: return new WindowsButton(); case Linux: return new LinuxButton(); } return null; }}

Factory Configurazione

Page 15: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

public class ButtonFactory { private final SupportedOperatingSystems os; public ButtonFactory(SupportedOperatingSystems os){ this.os = os; } public Button createButton() { switch (os) { case Windows: return new WindowsButton(); case Linux: return new LinuxButton(); } return null; }}

Factory

Logica di creazione

delle istanze

Configurazione

Page 16: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Client

public class Client { public void useButton() { ButtonFactory factory = new ButtonFactory( SupportedOperatingSystems.Windows); Button button = factory.createButton(); }}

Page 17: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Client

public class Client { public void useButton() { ButtonFactory factory = new ButtonFactory( SupportedOperatingSystems.Windows); Button button = factory.createButton(); }}

L’utilizzatore non sa quale oggetto è stato creato

Page 18: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Note

• A volte anziché creare una classe è sufficiente un metodo statico, un factory method

Page 19: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Pattern Strutturali

Page 20: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Adapter

• Permette di far lavorare assieme classi che hanno interfacce non compatibili

• L’adapter incapsula la classe e fornisce l’interfaccia richiesta

Page 21: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esempio

• Vogliamo sviluppare una applicazione che permetta l’utilizzo di diverse tecnologie di comunicazione, ad esempio Socket e RMI

• Ovviamente vogliamo evitare il più possibile duplicazioni di codice

Page 22: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Soluzione

• Scrivere la logica applicativa indipendentemente dal protocollo

• Implementare le classi per permettere la comunicazione

• Queste classi devono adattare il comportamento della classe a quello richiesto dal protocollo

Page 23: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Logica applicativa

public class ApplicationLogic { public void doSomething(){} public void doSomethingElse(){}}

Non implementa nulla relativamente ai protocolli di interazione con l’esterno

Page 24: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Adapterpublic class SocketAdapter { private final ApplicationLogic applicationLogic;

public SocketAdapter(ApplicationLogic applicationLogic) { this.applicationLogic = applicationLogic; }

public void messageReceived(String message) { if (message.equals("A")) { applicationLogic.doSomething(); } if (message.equals("B")) { applicationLogic.doSomethingElse(); } }}

Page 25: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Adapterpublic class SocketAdapter { private final ApplicationLogic applicationLogic;

public SocketAdapter(ApplicationLogic applicationLogic) { this.applicationLogic = applicationLogic; }

public void messageReceived(String message) { if (message.equals("A")) { applicationLogic.doSomething(); } if (message.equals("B")) { applicationLogic.doSomethingElse(); } }}

Logica vera e propria

Page 26: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Adapterpublic class SocketAdapter { private final ApplicationLogic applicationLogic;

public SocketAdapter(ApplicationLogic applicationLogic) { this.applicationLogic = applicationLogic; }

public void messageReceived(String message) { if (message.equals("A")) { applicationLogic.doSomething(); } if (message.equals("B")) { applicationLogic.doSomethingElse(); } }}

Logica vera e propria

Gestione del protocollo

Page 27: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Proxy

• Utile se vogliamo estendere, modificare o personalizzare le operazioni effettuate da una classe

• In genere permette di risolvere problemi di sicurezza o efficienza

Page 28: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esempio

• Aggiungere alla logica applicativa una cache per migliorare l’efficienza nella risposta alle richieste degli utenti

• L’interfaccia della cache non cambia rispetto a quella della logica vera e propria

Page 29: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Logica applicativa

public class ApplicationLogic implements ApplicationInterface{ @Override public Object performOperation(Object parameters) {...}

Page 30: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Cachepublic class CachingProxy implements ApplicationInterface { private final ApplicationInterface application; private final Map<Object, Object> cache;

public CachingProxy(ApplicationInterface application) { this.application = application; cache = new HashMap<Object, Object>(); }

@Override public Object performOperation(Object parameter) { if (!cache.containsKey(parameter)) { cache.put(parameter,application.performOperation(parameter)); } return cache.get(parameter); }}

Page 31: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Cachepublic class CachingProxy implements ApplicationInterface { private final ApplicationInterface application; private final Map<Object, Object> cache;

public CachingProxy(ApplicationInterface application) { this.application = application; cache = new HashMap<Object, Object>(); }

@Override public Object performOperation(Object parameter) { if (!cache.containsKey(parameter)) { cache.put(parameter,application.performOperation(parameter)); } return cache.get(parameter); }}

Stessa interfaccia

Page 32: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Cachepublic class CachingProxy implements ApplicationInterface { private final ApplicationInterface application; private final Map<Object, Object> cache;

public CachingProxy(ApplicationInterface application) { this.application = application; cache = new HashMap<Object, Object>(); }

@Override public Object performOperation(Object parameter) { if (!cache.containsKey(parameter)) { cache.put(parameter,application.performOperation(parameter)); } return cache.get(parameter); }}

Stessa interfaccia

Diverso comportamento

Page 33: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Note

• L’utilizzo del proxy non richiede nessuna modifica nel client che lo deve utilizzare

• Altri esempi di proxy sono le versioni unmodifiable delle collections

• In quel caso i metodi sono re-implementati per inibire le operazioni di modifica

Page 34: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Decorator

• Permette di aggiungere funzionalità ad un oggetto

• Il nuovo comportamento può essere aggiunto a run time

• Non richiede la creazione di nuove sottoclassi

Page 35: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esempio

• Scrivere una applicazione per rappresentare diversi tipi di caffè con diversi ingredienti

• Potremmo fare diverse sottoclassi, ma ne dovremmo fare troppe

• La soluzione delle sottoclassi non permetterebbe di aggiungere nuovi ingredienti a run time

Page 36: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Struttura basepublic interface Coffee { String getIngredients(); float getCost();}

public class SimpleCoffee implements Coffee{ @Override public String getIngredients() { return "Coffee"; }

@Override public float getCost() { return 5; }}

Classe di base, senza nessuna decorazione

Interfaccia “vista” dai client

Page 37: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Decorazionipublic abstract class CoffeeDecorator implements Coffee { private final Coffee decoratedCoffe;

public CoffeeDecorator(Coffee decoratedCoffee) { this.decoratedCoffe = decoratedCoffee; } @Override public float getCost(){ return decoratedCoffe.getCost(); }

@Override public String getIngredients() { return decoratedCoffe.getIngredients(); }}

Contiene un oggetto (anche con altre decorazioni) e permette di aggiungergli

decorazioni

Page 38: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Una decorazionepublic class Milk extends CoffeeDecorator {

public Milk(Coffee decoratedCoffee) { super(decoratedCoffee); }

@Override public float getCost() { return super.getCost() + .5f; }

@Override public String getIngredients() { return super.getIngredients() + " Milk"; }

}

Page 39: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Un’altra decorazionepublic class Whip extends CoffeeDecorator {

public Whip(Coffee decoratedCoffee) { super(decoratedCoffee); }

@Override public float getCost() { return super.getCost() + 1.0f; }

@Override public String getIngredients() { return super.getIngredients() + " Whip"; }

}

Page 40: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Come le usa il clientpublic class Client { public static void main(String args[]) { Coffee coffe = new SimpleCoffee(); Coffee decoratedCoffee = new Milk(coffe);

decoratedCoffee.getCost(); // 5.5 decoratedCoffee.getIngredients();// Coffee Milk decoratedCoffee = new Whip(decoratedCoffee); decoratedCoffee.getCost(); // 6.5 decoratedCoffee.getIngredients();// Coffee Milk Whip }}

Page 41: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Note

• Un approccio simile è usato nelle classi per l’input/output di Java: stream, writer, reader

• Oltre a modificare il comportamento è possibile anche aggiungere nuovi comportamenti

• Decorator è simile a Proxy, ma permette di comporre diversi comportamenti

Page 42: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Pattern Comportamentali

Page 43: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Strategy

• Permette di variare gli algoritmi utilizzati nell’implementazione della classe

• La classe base richiede una strategia esterna per portare a termine correttamente il suo compito

• L’abbiamo visto con l’ordinamento che richiede la sua strategia di comparazione tra una coppia di elementi

Page 44: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esempio

• Vogliamo scrivere il codice per rappresentare un robot che può avere diverse strategie per gestire il suo comportamento

• Vogliamo fare sì che i comportamenti possano cambiare mentre la nostra applicazione è in esecuzione

Page 45: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Robotpublic class Robot { private Behavior behavior;

public Robot(Behavior behavior) { this.behavior = behavior; }

public void changeBehavior(Behavior behavior) { this.behavior = behavior; }

public void move() { behavior.move(); }}

Page 46: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Comportamentipublic interface Behavior { void move();}

public class DefensiveBehavior implements Behavior { @Override public void move() { System.out.println("Defensive behavior"); }}

public class AggressiveBehavior implements Behavior { @Override public void move() { System.out.println("Aggressive behavior"); }}

Page 47: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Note

• La strategia può definire anche solo una parte del comportamento della classe (Come nel caso dell’ordinamento)

Page 48: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Observer

• Utile per gestire il paradigma ad eventi

• Permette di gestire dinamicamente l’accoppiamento tra sorgenti di eventi e classi che devono reagire quando questi si verificano

Page 49: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Come funziona

• Si ha una classe “Osservabile” (in Java si può implementare l’interfaccia Observable)

• Si hanno degli oggetti “Osservatori” (in Java si può implementare l’interfaccia Observer)

Page 50: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Observable (Java)• Si trova nel package java.util

• È l’interfaccia implementata dal Subject

• Fornisce metodi per registrare gli Observer:

• addObserver(Observer o)

• removeObserver(Observer o)

• Fornisce metodi per notificare eventi agli Observer quando qualcosa nell’oggetto Observable cambia:

• notifyObserver(Object arg)

Page 51: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Observer (Java)

• È un’interfaccia implementata dalle classi che possono ricevere notifiche di eventi da parte di classi Observable.

• Ha un solo metodo:

•update(Observable o, Object arg)

• Il metodo è invocato quando si verifica un cambiamento nell’oggetto osservato.

Page 52: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esempio: conto correntepublic class ObserverExample {

public static void main(String args[]) { Conto conto = new Conto(); SaldoObserver saldoObserver = new SaldoObserver(); conto.addObserver(saldoObserver); conto.aggiornaSaldo(30); }}public lass SaldoObserver implements Observer { public void update(Observable conto, Object saldo) { System.out.println("ricevuto aggiornamento saldo: " + saldo); }}public class Conto extends Observable { private Integer saldo = 0; public void aggiornaSaldo(Integer saldo) { this.saldo = saldo; setChanged(); notifyObservers(this.saldo); }}

Page 53: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Note

• Il pattern observer è utilizzato nel pattern Model View Controller per notificare alla View eventi generati nel Model e nel Controller.

Page 54: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Model-view-controller

Page 55: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Separation of concernsController

ModelView

Page 56: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Model

Incapsula lo stato dell’applicazione

Deve permettere di accedere ai dati

Deve notificare i cambiamenti dello stato

Page 57: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

View

Deve mostrare il modello

Gestisce l’interazione con l’utente

Page 58: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Controller

Rappresenta la logica applicativa

Collega le azioni dell’utente con modifiche allo stato

Sceglie cosa deve essere mostrato

Page 59: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Come interagiscono?

Modifica lo stato

Controller

ModelView

Seleziona una vista

Azioni dell’utente

Notifica cambiamenti

Richiede informazioni

Page 60: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

MVC: un possibile class diagram

Page 61: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Come si realizza?

Programmazione ad eventi per gestire la comunicazione tra i componenti

Page 62: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Eventi

Azioni dell’utente

Notifiche da model e controller

Sono delle classi e contengono delle informazioni dettagliate sull’evento

Page 63: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

EsempioMouseEvent

Evento già definito nelle librerie grafiche di Java

Contiene informazioni sull’evento:tipo (Click, movimento, ...)

quale bottone è stato cliccatoposizione del puntatore

Page 64: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Ascoltatori

Si mettono in ascolto di un evento

Devono avere dei metodi per poter reagire agli eventi

Possono esserci più ascoltatori per un evento

Page 65: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esempio

public interface MouseListener{ public void mouseClicked(MouseEvent e); public void mouseEntered(MouseEvent e); public void mouseExited(MouseEvent e); public void mousePressed(MouseEvent e); public void mouseReleased(MouseEvent e);}

Un listener deve implementare questa interfaccia e reagire nel modo opportuno agli eventi ricevuti

come parametri

Page 66: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Sorgenti di eventiNotificano gli eventi agli interessati

La notifica avviene invocando i metodi sugli ascoltatori

Devono avete un metodo per permettere la registrazione degli ascoltatori

Page 67: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Esempiopublic class EventSource{ private List<EventListener> listeners; public void registerListener(EventListener listener){ listeners.add(listener); }

private void notifyListeners(Event e){ for(EventListener listener : listeners){ listener.eventHappened(e); } }

public void foo(){ /* Viene generato un evento e inviata la notifica*/ notifyListeners(new Event(...)); }}

Page 68: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Logica ed interfaccia

Logica ed interfaccia utente devono essere separate

Servono due interfacce:Controller-Model/Viewaggiornare la visualizzazione

View/Controller-Modelinviare i comandi e le richieste

Page 69: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Cosa passare

SEMPRE oggetti che rappresentano eventi o creati appositamente

Oggetti modificabili del modello NON devono arrivare all’interfaccia

Page 70: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Soluzioni

Interfacce limitate (Solo metodi di visualizzazione)

Oggetti immutabili

Oggetti creati appositamente per la visualizzazione

Page 71: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Applicazioni distribuite

• Esempio di uso di MVC in una applicazione client/server in cui:

• la logica e i dati sono gestiti dal server

• l’interazione è gestita dal client

• Nota: il modo presentato non è l’unico!

Page 72: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Applicazioni distribuiteServer Client

Model View

Server Controller

Client Controller

Network AbstractionInterfaces

Page 73: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Possibile soluzione• Il Model viene implementato interamente nel

server.

• La View viene implementata interamente nel client.

• Il Controller viene implementato con un componente nel server e uno nel client.

• L’astrazione di rete mette a disposizione delle interfacce per permettere ai componenti del client di comunicare con i componenti del server.

Page 74: Esercitazione sui Design Pattern - Intranet DEIBhome.deib.polimi.it/dubois/provafinale/designpatterns.pdf · Design Pattern. Pattern Creazionali. Singleton ... • Il pattern observer

Riconoscere un buon design

• Deve essere possibile modificare il tipo di rete (Socket o RMI) senza modificare Model e View.

• Deve essere possibile modificare il tipo di view (grafica o testuale) senza modificare Model, Server Controller, e le astrazioni di rete.

• Suggerimento: disaccoppiare la parti di Model/View/Controller (e le astrazioni di rete) utilizzando opportune interfacce e/o design pattern!