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. 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. Anche il design pattern Iterator si basa su questo concetto di isolamento.
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
Esempio
L'esempio seguente è stato codificato con il linguaggio di programmazione Java.
// "Strategy"publicinterfaceISortStrategy{publicvoidsort(List<Document>documentList);}// "classe concreta Strategy" publicclassQuickDocumentSortimplementsISortStrategy{publicvoidsort(List<Document>documentList){// Call overloaded SortsortQuickSort(documentList);}// Ordina usando l'algoritmo del quickSortprivatevoidsortQuickSort(List<Document>list){//Ordina i documenti usando l'algoritmo del quicksortCollection.quickSort(list,left,right);}}// "classe concreta Strategy" publicclassMergeDocumentSortimplementsISortStrategy{publicvoidsort(List<Document>documentList){// Call overloaded SortsortMergeSort(documentList);}// Ordina usando l'algoritmo del mergeSortprivatevoidsortMergeSort(List<Document>list){//Ordina i documenti usando l'algoritmo del mergeSortCollection.mergeSort(list,left,right);}}//Contesto in cui viene usato il pattern strategy. Abbiamo una lista di documenti che deve essere ordinata.publicclassSortedDocumentList{//Lista di documentiprivateList<Document>documentList=newList<Document>();//Algoritmo per l'ordinamento dei documentiprivateISortStrategysortStrategy;publicSortedDocumentList(List<Document>documents){this.documentList=documents;}publicvoidsetSortStrategy(ISortStrategysortStrategy){this.sortStrategy=sortStrategy;}publicvoidadd(Documentdocument){documentList.add(document);}//Ordina la lista di documenti usando un algoritmo di ordinamentopublicvoidsort(){//Ordina i documentisortStrategy.sort(documentList);// Display resultsfor(Documentdocument:documentList){System.out.println(document.getTitle());}}}classDocument{privateStringtitle;privateStringcode;publicDocument(Stringtitle,Stringcode){this.title=title;this.code=code;}publicStringgetTitle(){returntitle;}publicvoidsetCode(Stringcode){this.code=code;}}
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.
publicclassSortDocument{publicvoidsort(List<Document>documents){QuickDocumentSortquickDocumentSort=newQuickdocumentSort();SortedDocumentListsortedDocumentList=newSortedDocumentList(documents);//Aggiungi l'algoritmo per effettuare l'ordinamentosortedDocumentList.setSortStrategy(quickDocumentSort);//Ordina i documenti usando l'algoritmo quickDocumentSortsortedDocumentList.sort();MergeDocumentSortmergeDocumentSort=newMergeDocumentSort();sortedDocumentList.setSortStrategy(mergeDocumentSort);//Ordina di nuovo la lista usando un altro algoritmo di ordinamentosortedDocumentList.sort();}}
Considerazioni
Questa sezione sull'argomento informatica è ancora vuota. Aiutaci a scriverla!