Strategy pattern: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto"
 
(32 versioni intermedie di 25 utenti non mostrate)
Riga 1:
{{S|informaticaprogrammazione}}
Nella [[Programmazione orientata agli oggetti|programmazione ad oggetti]], lo '''Strategy pattern''' è uno dei pattern fondamentali, definiti originariamente dalla [[gang of four]].
 
LoNella [[Programmazione orientata agli oggetti|programmazione ad oggetti]], lo '''Strategystrategy pattern''' è uno dei [[design pattern|pattern]] comportamentali.fondamentali, L'obiettivodefiniti dioriginariamente questadalla architettura[[Gang èof isolareFour un(scrittori)|Gang algoritmoof all'interno di un oggettoFour]].
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.
 
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. Anche il design pattern [[Iterator pattern|Iterator]] si basa su questo concetto di isolamento.
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.
 
Questo pattern prevede che gli algoritmi siano intercambiabili tra loro, in base ad una specificata condizione, in modalità trasparente al client che ne fa uso. In altre parole, data una famiglia di algoritmi che implementa una certa funzionalità, come può essere ad esempio un algoritmo di visita oppure di ordinamento, essa dovrà esportare sempre la medesima interfaccia, così il [[client]] dell'algoritmo non dovrà 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]].
{{...}}
<syntaxhighlight lang="java">
 
// "Strategy"
public interface ISortStrategy
{
public void sort(List<Document> documentList);
}
 
// "classe concreta Strategy"
public class QuickDocumentSort implements ISortStrategy
{
public void sort(List<Document> documentList)
{
// Call overloaded Sort
sortQuickSort(documentList);
}
 
// Ordina usando l'algoritmo del quickSort
private void sortQuickSort(List<Document> list)
{
//Ordina i documenti usando l'algoritmo del quicksort
Collection.quickSort(list,left,right);
}
}
 
// "classe concreta Strategy"
public class MergeDocumentSort implements ISortStrategy
{
public void sort(List<Document> documentList)
{
// Call overloaded Sort
sortMergeSort(documentList);
}
 
// Ordina usando l'algoritmo del mergeSort
private void sortMergeSort(List<Document> list)
{
//Ordina i documenti usando l'algoritmo del mergeSort
Collection.mergeSort(list,left,right);
}
}
 
//Contesto in cui viene usato il pattern strategy. Abbiamo una lista di documenti che deve essere ordinata.
//Contesto
public class SortedDocumentList
{
//Lista di documenti
private List<Document> documentList = new List<Document>();
//Algoritmo per l'ordinamento dei documenti
private ISortStrategy sortstrategy;
private ISortStrategy sortStrategy;
 
public SortedDocumentList( List<Document> documents ){
this.documentList = documents;
}
public void setSortStrategy(ISortStrategy SortStrategysortStrategy)
{
setthis.sortStrategy = sortStrategy;
{
this.sortstrategy = value;
}
}
 
public void Addadd(Document document)
{
documentList.Addadd(document);
}
 
//Ordina la lista di documenti usando un algoritmo di ordinamento
public void Sort()
public void sort()
{
sortstrategy.Sort(documentList);//Ordina i documenti
sortStrategy.sort(documentList);
 
// Display results
foreachfor (Document document in: documentList )
{
ConsoleSystem.WriteLine(stringout.Formatprintln(" {0}",document.TitlegetTitle());
}
Console.WriteLine();
}
}
 
 
//classe concreta
class Document
{
private stringString title;
private stringString codicecode;
 
public Document(stringString title, stringString codicecode)
{
this.title = title;
this.codicecode = codicecode;
}
public stringString TitlegetTitle()
{
get { return title; }
}
public stringvoid CodicesetCode(String code)
{
getthis.code {= return codicecode; }
}
}
 
</syntaxhighlight>
// "Strategy"
Utilizzo dello Strategy: nel seguente esempio vediamo come ordinare una lista di documenti con due diversi algoritmi di ordinamento senza che la classe che si occupa di ordinare i documenti conosca l'implementazione dell'algoritmo di ordinamento.
interface ISortStrategy
<syntaxhighlight lang="java">
{
void Sort(List<Document> documentList);
}
 
public class SortDocument {
// "classe concreta Strategy"
class QuickDocumentSort : ISortStrategy
{
public void Sort(List<Document> documentList)
{
// Call overloaded Sort
Sort(documentList, 0, documentList.Count - 1);
Console.WriteLine("QuickSorted list ");
}
 
public void sort(List<Document> documents) {
// Recursively sort
QuickDocumentSort quickDocumentSort = new QuickdocumentSort();
private void Sort(List<Document> list, int left, int right)
{
SortedDocumentList sortedDocumentList = new SortedDocumentList(documents);
//ordinamento da implementare
}
//Aggiungi l'algoritmo per effettuare l'ordinamento
sortedDocumentList.setSortStrategy(quickDocumentSort);
//Ordina i documenti usando l'algoritmo quickDocumentSort
sortedDocumentList.sort();
MergeDocumentSort mergeDocumentSort = new MergeDocumentSort();
sortedDocumentList.setSortStrategy(mergeDocumentSort);
//Ordina di nuovo la lista usando un altro algoritmo 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, 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 Patterns}}
 
{{Design pattern}}
[[Categoria:Pattern]]
{{portale|informatica}}
 
[[Categoria:Design pattern]]
[[ar:نموذج الإستراتيجية]]
[[bg:Стратегия (шаблон)]]
[[ca:Patró estratègia]]
[[cs:Strategy]]
[[de:Strategie (Entwurfsmuster)]]
[[en:Strategy pattern]]
[[es:Strategy (patrón de diseño)]]
[[fr:Stratégie (patron de conception)]]
[[gl:Strategy (patrón de deseño)]]
[[ja:Strategy パターン]]
[[pl:Strategia (wzorzec projektowy)]]
[[pt:Strategy]]
[[ru:Стратегия (шаблон проектирования)]]
[[uk:Стратегія (шаблон проектування)]]
[[vi:Strategy pattern]]
[[zh:策略模式]]