Strategy pattern: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Modifica dell'esempio dell'utilizzo del pattern strategy |
m →Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto" |
||
(27 versioni intermedie di 20 utenti non mostrate) | |||
Riga 1:
{{S|
Nella [[Programmazione orientata agli oggetti|programmazione ad oggetti]], lo '''strategy pattern''' è uno dei [[design pattern|pattern]] fondamentali, definiti originariamente dalla [[
L'obiettivo di questa architettura è isolare un [[algoritmo]] all'interno di un oggetto, in maniera tale da risultare utile in quelle situazioni dove sia necessario modificare dinamicamente gli algoritmi utilizzati da un'[[applicazione (informatica)|applicazione]]. Si pensi ad esempio alle possibili visite in una struttura ad albero (visita anticipata, simmetrica, posticipata)
▲Nella [[Programmazione orientata agli oggetti|programmazione ad oggetti]], lo '''strategy pattern''' è uno dei pattern fondamentali, definiti originariamente dalla [[gang of four]].
Questo pattern prevede che gli algoritmi siano intercambiabili tra loro,
▲Si pensi ad esempio alle possibili visite in una struttura ad albero (visita anticipata, simmetrica, posticipata): mediante il pattern strategy è possibile selezionare a tempo di esecuzione una tra le visite ed eseguirla sull'albero per ottenere il risultato voluto. Il design pattern [[Iterator pattern|Iterator]] si basa proprio su questo.
▲Questo pattern prevede che gli algoritmi siano intercambiabili tra loro (in base ad una qualche condizione) in modo trasparente al client che ne fa uso. In altre parole: la famiglia di algoritmi che implementa una funzionalità (ad esempio di visita o di ordinamento) esporta sempre la medesima interfaccia, in questo modo il client dell'algoritmo non deve fare nessuna assunzione su quale sia la strategia istanziata in un particolare istante.
== Struttura ==
▲[[File:StrategyPattern.png|center|Struttura del Design Pattern Strategy]]
== Esempio ==
L'esempio seguente è stato codificato con il linguaggio di programmazione [[Java (linguaggio di programmazione)|Java]].
▲<source lang="java">
// "Strategy"
Line 36 ⟶ 30:
}
// Ordina usando l'
private void sortQuickSort(List<Document> list)
{
Line 43 ⟶ 37:
}
}
// "classe concreta Strategy"
public class
{
public void sort(List<Document> documentList)
Line 55 ⟶ 48:
}
// Ordina usando l'
private void sortMergeSort(List<Document> list)
{
//Ordina i documenti usando l'algoritmo del
Collection.mergeSort(list,left,right);
}
Line 68 ⟶ 61:
//Lista di documenti
private List<Document> documentList = new List<Document>();
//
private ISortStrategy
public SortedDocumentList( List<Document> documents ){
this.documentList = documents;
}▼
public void setSortStrategy(ISortStrategy
{
this.
}
public void
{
documentList.
}
//Ordina la lista di documenti usando un
public void sort()
{
//Ordina i documenti
// Display results
Line 98 ⟶ 94:
class Document
{
private
private
public Document(
{
this.title = title;
this.
}
public String getTitle()
Line 110 ⟶ 106:
return title;
}
public void
{
this.
}
}
</syntaxhighlight>
Utilizzo dello Strategy: nel seguente esempio vediamo come ordinare una lista di documenti con due diversi
<
public class SortDocument {
public void sort(List<Document> documents) {
▲ QuickDocumentSort quickDocumentSort = new QuickdocumentSort(documents);
SortedDocumentList sortedDocumentList = new SortedDocumentList(documents);▼
sortedDocumentList.setSortStrategy(quickDocumentSort);▼
sortedDocumentList.sort();▼
▲ SortedDocumentList sortedDocumentList = new SortedDocumentList();
sortedDocumentList.setSortStrategy(mergeDocumentSort);▼
▲ //Aggiungi l'algoritimo per effetturare l'ordinamento
▲ sortedDocumentList.setSortStrategy(quickDocumentSort);
sortedDocumentList.sort();▼
▲ //Ordina i documenti usando l'algortimo quickDocumentSort
▲ sortedDocumentList.sort();
▲ MergeDocumentSort mergeDocumentSort = new MergeDocumentSort (documents);
▲ sortedDocumentList.setSortStrategy(mergeDocumentSort);
▲ //Ordina di nuovo la lista usando un altro algortimo di ordinamento
▲ sortedDocumentList.sort();
}
}
</syntaxhighlight>
== Considerazioni ==
{{...|informatica}}
== Bibliografia ==▼
* [[Erich Gamma|Gamma, E.]], [[Richard Helm|Helm, R.]], [[Ralph Johnson (informatico)|Johnson, R.]] e [[John Vlissides|Vlissides, J.]], '' [[Design Patterns]]: elementi per il riuso di software a oggetti'', Addison Wesley,
** Originale: ''Design Patterns: Elements of Reusable Object-Oriented Software'', Addison Wesley,
== Voci correlate ==
* [[Decorator]]
* [[Command pattern
* [[
▲== Bibliografia ==
▲* [[Erich Gamma|Gamma, E.]], [[Richard Helm|Helm, R.]], [[Ralph Johnson (informatico)|Johnson, R.]] e [[John Vlissides|Vlissides, J.]], '' [[Design Patterns]]: elementi per il riuso di software a oggetti'', Addison Wesley, [[1995]], ISBN 88-7192-150-X
▲** Originale: ''Design Patterns: Elements of Reusable Object-Oriented Software'', Addison Wesley, [[1995]], ISBN 0-201-63361-2
== Altri progetti ==
{{interprogetto|
{{Design
{{portale|informatica}}
[[Categoria:
|