Strategy pattern: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m ortografia
m Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto"
 
(26 versioni intermedie di 20 utenti non mostrate)
Riga 1:
{{S|informaticaprogrammazione}}
 
Nella [[Programmazione orientata agli oggetti|programmazione ad oggetti]], lo '''strategy pattern''' è uno dei [[design pattern|pattern]] fondamentali, definiti originariamente dalla [[gangGang of Four (scrittori)|Gang of fourFour]].
 
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):; mediante il pattern strategy è possibile selezionare a tempo di [[esecuzione (informatica)|esecuzione]] una tra le visite ed eseguirla sull'albero per ottenere il risultato voluto. IlAnche il design pattern [[Iterator pattern|Iterator]] si basa proprio su questo concetto di isolamento.
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, (in base ad una qualchespecificata condizione), in modomodalità trasparente al client che ne fa uso. In altre parole:, ladata una famiglia di algoritmi che implementa una certa funzionalità, come può essere (ad esempio un algoritmo di visita ooppure di ordinamento), essa dovrà esportaesportare sempre la medesima interfaccia, in questo modocosì il [[client]] dell'algoritmo non devedovrà fare nessuna assunzione su quale sia la strategia istanziata in un particolare istante.
Lo '''strategy pattern''' è uno dei [[design pattern|pattern]] comportamentali. L'obiettivo di questa architettura è isolare un algoritmo all'interno di un oggetto.
Il pattern strategy è utile in quelle situazioni dove sia necessario modificare dinamicamente gli algoritmi utilizzati da un'applicazione.
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]]
 
[[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]].
{{...}}
<sourcesyntaxhighlight lang="java">
 
L'esempio seguente è in [[Java (linguaggio_di_programmazione)|Java]].
<source lang="java">
 
// "Strategy"
Line 36 ⟶ 30:
}
 
// Ordina usando l'algoritimoalgoritmo del quickSort
private void sortQuickSort(List<Document> list)
{
Line 43 ⟶ 37:
}
}
 
 
// "classe concreta Strategy"
public class MergDocumentSortMergeDocumentSort implements ISortStrategy
{
public void sort(List<Document> documentList)
Line 55 ⟶ 48:
}
 
// Ordina usando l'algoritimoalgoritmo del quickSortmergeSort
private void sortMergeSort(List<Document> list)
{
//Ordina i documenti usando l'algoritmo del quicksortmergeSort
Collection.mergeSort(list,left,right);
}
Line 68 ⟶ 61:
//Lista di documenti
private List<Document> documentList = new List<Document>();
//AlgortimoAlgoritmo per l'ordinamento dei documenti
private ISortStrategy sortstrategysortStrategy;
 
public SortedDocumentList( List<Document> documents ){
this.documentList = documents;
}
public void setSortStrategy(ISortStrategy sortstrategysortStrategy)
{
this.sortstrategysortStrategy = sortstrategysortStrategy;
}
 
public void Addadd(Document document)
{
documentList.Addadd(document);
}
 
//Ordina la lista di documenti usando un algortimoalgoritmo di ordinamento
public void sort()
{
//Ordina i documenti
sortstrategysortStrategy.sort(documentList);
 
// Display results
Line 98 ⟶ 94:
class Document
{
private stringString title;
private stringString codicecode;
 
public Document(stringString title, stringString codicecode)
{
this.title = title;
this.codicecode = codicecode;
}
public String getTitle()
Line 110 ⟶ 106:
return title;
}
public void setCodicesetCode(String codicecode)
{
this.codicecode = codicecode;
}
}
 
</syntaxhighlight>
</source>
Utilizzo dello Strategy: nel seguente esempio vediamo come ordinare una lista di documenti con due diversi algortimialgoritmi di ordinamento senza che la classe che si occupa di ordinare i documenti conosca l'implemetazioneimplementazione dell'algortimoalgoritmo di ordinamento.
<sourcesyntaxhighlight lang="java">
 
public class SortDocument {
 
public void sort(List<Document> documents) {
QuickDocumentSort quickDocumentSort = new QuickdocumentSort(documents);
QuickDocumentSort quickDocumentSort = new QuickdocumentSort(documents);
SortedDocumentList sortedDocumentList = new SortedDocumentList(documents);
//Aggiungi l'algoritimoalgoritmo per effetturareeffettuare l'ordinamento
sortedDocumentList.setSortStrategy(quickDocumentSort);
//Ordina i documenti usando l'algortimoalgoritmo quickDocumentSort
sortedDocumentList.sort();
MergeDocumentSort mergeDocumentSort = new MergeDocumentSort (documents);
SortedDocumentList sortedDocumentList = new SortedDocumentList();
 
sortedDocumentList.setSortStrategy(mergeDocumentSort);
//Aggiungi l'algoritimo per effetturare l'ordinamento
sortedDocumentList.setSortStrategy(quickDocumentSort);
//Ordina di nuovo la lista usando un altro algortimoalgoritmo di ordinamento
 
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>
</source>
 
 
== 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, [[1995]], ISBN 88-7192-150-X
** Originale: ''Design Patterns: Elements of Reusable Object-Oriented Software'', Addison Wesley, [[1995]], ISBN 0-201-63361-2
 
== Voci correlate ==
* [[Decorator]]
* [[Command pattern|Command]]
* [[Factory_method|Factory method]]
 
== 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|commonspreposizione=Strategy patternsullo}}
 
{{Design Patterns Patternspattern}}
{{portale|informatica}}
 
[[Categoria:PatternDesign pattern]]