Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Problema
L'oggetto che si vuole utilizzare fornisce le funzionalità di base necessarie, ma si potrebbe aver bisogno di aggiungere alcune funzionalità aggiuntive all'oggetto.
Soluzione
Permette di aggiungere funzionalità senza dover ricorrere a una sottoclasse.
Participants & Component
Definisce l'interfaccia dell'oggetto a cui verranno aggiunte nuove funzionalità.
Collaborators
ConcreteComponent: definisce l'oggetto concreto al quale aggiungere le funzionalità.
Decorator: mantiene un riferimento all'oggetto Component e definisce un'interfaccia conforme all'interfaccia Component.
ConcreteDecorator: aggiunge le funzionalità al Component.
Conseguenze
Le funzionalità che possono essere aggiunte risiedono in piccoli oggetti, il vantaggio è rappresentato dalla possibilità di aggiungere dinamicamente le funzionalità nel ConcreteComponent.
Implementazione
Creazione
di una classe astratta che rappresenta la classe originaria e le nuove funzioni da aggiungere. Nel decorator si implementano le chiamate alle nuove funzioni prima o dopo le chiamate esistenti, per ottenere il giusto ordine.
Descrizione
Il decorator consente di aggiungere durante il run-time nuove funzionalità ad oggetti già esistenti. Questo viene realizzato costruendo una nuova classe che "avvolge" l'oggetto originale.
Al costruttore del decoratore si passa come parametro l'oggetto originale. È inoltre possibile passarvi un diverso decoratore. In questo modo, più decoratori possono essere concatenati l'uno all'altro, aggiungendo così in modo incrementale funzionalità alla classe concreta.
Questo pattern si pone come valida alternativa all'uso dell'ereditarietà singola o multipla. Con l'ereditarietà, infatti, l'aggiunta di funzionalità avviene
staticamente secondo i legami definiti nell'agerarchia di classi e non è possibile ottenere al run-time una combinazione arbitraria delle funzionalità, né la loro aggiunta/rimozione.
Esempio: Singleton Pattern
sabato 18 luglio 2015 22:39
Carta di identità
Proprietà: Descrizione
- Nome: Singleton Pattern
- Obiettivo: Avere una sola istanza di un oggetto senza che questo sia dichiarato globalmente
- Problema: Client diversi necessitano di riferirsi a un solito oggetto e si vuol essere sicuri di avere una sola istanza di esso.
- Soluzione: Garantire una sola istanza
- Participants & Collaborators: I Clients creano un'istanza del Singleton soltanto attraverso il metodo getInstances
- Conseguenze: I Clients non devono occuparsi autonomamente di verificare che il Singleton esista, ciò è controllato dall'istanza del Singleton
- Implementazione: Aggiungere un metodo privato statico della classe che si riferisce all'oggetto desiderato (inizialmente nullo). Aggiungere...
metodo pubblico statico che istanzi la classe se non lo è stato fatto e ritorna l'oggetto istanziato. Impostare lo stato del costruttore come protetto o privato così che nessuno possa istanziare la relativa classe in modo diretto.
Descrizione
Il singleton ha lo scopo di garantire che di una determinata classe venga creata una e una sola istanza, e di fornire un punto di accesso globale a tale istanza.
L'implementazione più semplice di questo pattern prevede che la classe singleton abbia un unico costruttore privato, in modo da impedire l'istanziazione diretta della classe. La classe fornisce inoltre un metodo getter statico che restituisce una istanza della classe (sempre la stessa), creandola preventivamente o alla prima chiamata del metodo, e memorizzandone il riferimento in un attributo privato anch'esso statico.
Esempio: Double-Checked Locking Pattern
Sabato 18 luglio 2015, 23:06
Carta di identità
Descrizione
Il Double Checked Locking è uno dei metodi utilizzati per implementare in modo efficiente il pattern Singleton in Java. Questo metodo prevede l'utilizzo di un blocco di codice sincronizzato all'interno del metodo getter per garantire che l'istanza venga creata una sola volta.
```più subdoli antipattern della programmazione concorrente,principalmente in Java.Questo perché inizializzare un oggetto comporta la scrittura di alcune variabili (stato dell'oggetto),pubblicare un oggetto riguarda la scrittura di altre variabili (il reference). Se non si assicura che pubblicarel'oggetto accada prima che un thread possa leggerne il reference, la scrittura del reference può essereriordinata con le scritture dello stato dell'oggetto.In tale caso un Thread può vedere un valore aggiornato per il reference, ma un valore non aggiornato peralcune delle variabili che compongono lo stato dell'oggetto. Si ottiene quindi il reference ad un oggettoparzialmente costruito.Senza utilizzare tecniche troppo elaborate e spesso inutili è possibile risolvere il problema con il seguentecodice:
public class EagerInstantiation {
private static final Resource _instance = new Resource();
public static Resource getResource() {
return _instance;
}
}
Observer Pattern
Obiettivo: Definire una dipendenza di tipo uno a molti tra gli oggetti per cui quando un oggetto cambia stato, tutte le sue dipendenze vengono notificate e aggiornate.
Problema: Necessità di notificare il cambiamento di una lista di oggetti provocato da un evento.
Soluzione: L'Observer delega la responsabilità di monitorare un evento a un oggetto centrale: il Subject.
Partecipanti: Il Subject conosce il proprio Observer poiché è registrato con esso. Il Subject deve notificare l'Observer quando avviene un evento. L'Observer è responsabile sia di registrare il Subject e di ricevere le informazioni dal Subject quando viene notificato.
Conseguenze: Il Subject può informare gli Observer riguardo un evento, esso non necessita di sapere se qualche Observer è interessato.
all'evento. Implementazione Istanziare un oggetto (Observer) che ha il compito informare, quando si verifica un evento che li riguarda, un altro oggetto (Subject) che osserva l'evento o lo innesca. Descrizione Definisce una dipendenza di tipo uno a molti tra gli oggetti per cui quando un oggetto cambia stato, tutte le sue dipendenze vengono notificate e aggiornate. L'Observer pattern è un design pattern utilizzato per tenere sotto controllo lo stato di diversi oggetti. È un pattern intuitivamente utilizzato come base architetturale di molti sistemi di gestione di eventi, è possibile individuarlo in maniera rudimentale nella programmazione di sistema Windows. Sostanzialmente il pattern si basa su uno o più oggetti, chiamati osservatori o listener, che vengono registrati per gestire un evento che potrebbe essere generato dall'oggetto "osservato". Oltre all'observer esiste il concreteObserver che si differenzia dal primo perchéimplementa direttamente le azioni da compiere in risposta ad un messaggio; il primo è una classe astratta, il secondo no. Uno degli aspetti fondamentali è che tutto il funzionamento dell'observer si basa su meccanismi di callback, implementabili in diversi modi, o tramite funzioni virtuali o tramite puntatori a funzioni passati quali argomenti nel momento della registrazione dell'observer, e spesso a questa funzione vengono passati dei parametri in fase di generazione dell'evento. In generale il pattern impiega le seguenti classi: - Soggetto: Una classe che fornisce interfacce per registrare o rimuovere gli observer e che implementa le seguenti funzioni: - Attach - Detach - Notify - Soggetto Concreto: Classe che fornisce lo stato dell'oggetto agli observer e che si occupa di effettuare le notifiche chiamando la funzione notify nella classe padre (Soggetto). Contiene la funzione GetState che restituisce lo stato del soggetto. - Observer: Questa classe definisce implementa direttamente le azioni da compiere in risposta ad un messaggio.Un'interfaccia per tutti gli observers, per ricevere le notifiche dal soggetto. È utilizzata come classe astratta per implementare i veri Observer, ossia i ConcreteObserver.
Funzioni:
- Update - una funzione astratta che deve essere implementata dagli observer.
ConcreteObserver
Questa classe mantiene un riferimento al Subject (Concreto), per ricevere lo stato quando avviene una notifica. La funzione non astratta è Update, quando questa viene chiamata dal Soggetto, il ConcreteObserver chiama la getstate sul soggetto per aggiornare l'informazione su di esso.
Esempio:
Template Method Pattern
domenica 19 luglio 2015
00:10
Carta di identità
Proprietà Descrizione
Nome Template Method Pattern
Obiettivo Definire la struttura di un algoritmo lasciando alle sottoclassi il compito di implementarne alcuni passi come preferiscono
Problema Esiste una procedura o una serie di passi da seguire a un certo livello di dettaglio, ma i singoli passi possono avere implementazioni
Differenti a livelli sottostanti.
Soluzione: Permettere la definizione di sottopassi che variano pur mantenendo una struttura di base.
Participants: Il Template Method consiste di una classe astratta che definisce la classe TemplateMethod di base che necessità di un override. Ogni classe concreta deriva dalla classe astratta implementando i nuovi metodi per il Template.
Conseguenze: I template sono una buona piattaforma per il riutilizzo del codice, inoltre sono di aiuto per assicurarsi l'implementazione dei passi richiesti. I template vincolano insieme i passi sovrascritti (overriden) per ogni classe concreta e quindi dovrebbero essere utilizzati solo quando queste variazioni avvengono sempre insieme.
Implementazione: Creare una classe astratta che implementi una procedura utilizzando metodi astratti. I metodi astratti devono essere implementati in sottoclassi per poter eseguire ogni passo della procedura. Se ogni passo varia indipendentemente dagli altri, ogni passo deve essere
` per racchiudere il testo della descrizione: ```html
Questo pattern permette di definire la struttura di un algoritmo lasciando alle sottoclassi il compito di implementarne alcuni passi come preferiscono. In questo modo si può ridefinire e personalizzare parte del comportamento nelle varie sottoclassi senza dover riscrivere più volte il codice in comune.
``` 2. Utilizzare il tag `` per creare un sottotitolo per la descrizione:
```html
Descrizione
```
3. Utilizzare il tag `` per creare una lista puntata per i casi in cui il pattern è adatto:
```html
- quando si vuole implementare la parte invariante di un algoritmo una volta sola e lasciare che le sottoclassi implementino il comportamento che può variare
- quando il comportamento comune di più classi può essere fattorizzato in una classe a parte per evitare di scrivere più volte lo stesso codice
- per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo i
```
4. Utilizzare il tag `` per racchiudere il testo finale:
```html
per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo i
```
Il testo formattato con i tag html sarà quindi:
```html
Questo pattern permette di definire la struttura di un algoritmo lasciando alle sottoclassi il compito di implementarne alcuni passi come preferiscono. In questo modo si può ridefinire e personalizzare parte del comportamento nelle varie sottoclassi senza dover riscrivere più volte il codice in comune.
Descrizione
- quando si vuole implementare la parte invariante di un algoritmo una volta sola e lasciare che le sottoclassi implementino il comportamento che può variare
- quando il comportamento comune di più classi può essere fattorizzato in una classe a parte per evitare di scrivere più volte lo stesso codice
- per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo i
per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo i
```
- quando si vuole implementare la parte invariante di un algoritmo una volta sola e lasciare che le sottoclassi implementino il comportamento che può variare
- quando il comportamento comune di più classi può essere fattorizzato in una classe a parte per evitare di scrivere più volte lo stesso codice
- per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo i
` per racchiudere il testo finale: ```html
per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo i
``` Il testo formattato con i tag html sarà quindi: ```htmlQuesto pattern permette di definire la struttura di un algoritmo lasciando alle sottoclassi il compito di implementarne alcuni passi come preferiscono. In questo modo si può ridefinire e personalizzare parte del comportamento nelle varie sottoclassi senza dover riscrivere più volte il codice in comune.
Descrizione
- quando si vuole implementare la parte invariante di un algoritmo una volta sola e lasciare che le sottoclassi implementino il comportamento che può variare
- quando il comportamento comune di più classi può essere fattorizzato in una classe a parte per evitare di scrivere più volte lo stesso codice
- per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo i
per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo i
```