Aprendre plegats
divendres, d’abril 08, 2005
 
ES2(40) Estratègies
Com ja sabeu, el programa de l'assignatura ES2 inclou tres patrons de disseny que els estudiants han d'aprendre pel seu compte. Un d'aquests patrons és el patró estratègia. Segons el diccionari, en esports l'estratègia és "Conjunt de regles, de jugades i de decisions mitjançant les quals un jugador o un equip de jugadors intenta d'aconseguir la vistòria o la solució" Què és en patrons de disseny de programari?.

Si voleu, podeu usar aquesta entrada del blog per "aprendre plegats" aquest patró de disseny. Idees de coses que podeu comentar (si ho creieu útil):
  1. Bibliografia que considereu bona.
  2. Descriure què fa el patró.
  3. Indicar exemples d'utilització del patró.
  4. Quines alternatives hi ha a l'ús del patró. Val la pena usar el patró?.
Mireu d'aprendre el patró abans del proper exercici de control (poden sortir-ne preguntes). Per altra banda, aviat el farem servir en els exercicis del curs.
Comments:
Jo he trobat aquest article. http://www.javahispano.org/articles.article.action?id=91
Parla sobre el patró estratègia i trobo que és molt complet. Explica quan aplicar el patró, exemples d'aplicació (fins i tot en java) i les seves avantatges e inconvenients. L'explicació és molt semblant a les que es fan a classe però més completa i extensa, tot i que es troba a faltar algun diagrama de seqüència.
 
Patró Estratègia

Aquesta és la informació que he intentat recollir sobre aquest patró:

Usar Patró Estratègia és una bona opció quan tenim certs objectes que són bàsicament el mateix però que difereixen en el seu comportament.
Llavors, amb aquest patró de disseny podem reduir aquests objectes a una classe que usi diferents estratègies per a complir els diferents comportaments.
Per tant, es separa l'objecte del seu comportament en dos classes diferents, de manera que l'objecte pot canviar l'algoritme que usa en qualsevol moment.


*** Intenció del patró:

Definir una família d'algoritmes encapsulats i fer-los intercanviables de manera que cada algoritme pot variar independentment dels clients que l'usen.



*** Solució:

1. Crear una classe abstracta "Estratègia" que defineix la interfície comuna als diferents algoritmes (comportaments) suportats amb algoritme().

2. Definir una subclasse de "Estratègia", "EstratègiaConcreta" per cada implementació dels diferents algoritmes que usen la interfície. Implementacions concretes d'algoritme().

3. Tenir la classe client "Context", que és la classe per la que es defineixen els diferents comportaments, i per tant usa l'algoritme definit a la interfície "Estratègia", a la que té una referència.

4. Crear l'estratègia específica "EstratègiaConcreta" que es necessiti en cert moment i configurar el "Context" per usar-la.



*** Avantatges d'usar aquest patró:

- Resulta una tasca fàcil, alhora que es respecta el principi Obert-Tancat, el fet d'afegir altres comportaments (estratègies) del "Context".

- Permet reusar fàcilment codi dins la família d'algoritmes o comportaments, ja que l'herència es pot usar (en les definicions d'estratègies) per treure funcionalitats comunes.

- És més flexible que heredar directament de la classe "Context" per variar el comportament, ja que l'herència no permet variar l'algoritme dinàmicament, sinó que s'hauria de crear una nova instància de la subclasse "Context" i reemplaçar-lo. En canvi, amb el Patró Estratègia sols cal canviar la referència cap a la "EstratègiaConcreta" que es necessiti per a variar el comportament de "Context".

- Les estratègies es poden usar per evitar condicionals i particularment, casos de "switch". Els codis que contenen varis casos condicionals, normalment indiquen que és necessari aplicar el patró Estratègia.

- Les estratègies poden ser usades per proveir diferents implementacions de comportaments similars, per fer un balanç d'optimització.



*** Desavantatges d'usar aquest patró:

- S'incrementa el nombre d'objectes de l'aplicació, fent el disseny més complicat d'entendre.

- Els algoritmes d'implementació de les estratègies poden no haver d'usar tots els paràmetres definits a la interfície de "Estratègia".

- Els clients poden necessitar tenir coneixement de les diferents implementacions de comportament, així com les seves diferències, per poder-ne triar la més adient.



*** Observacions en l'implementació:

- Normalment, les estratègies són objectes sense estat, per reduir el nombre d'objectes de l'aplicació.

- Tenir una referència de "Estratègia" a "Context" disminueix la flexibilitat i reusabilitat i per tant, no és recomanat. El que es pot fer és:

-- passar la informació necessària de "Context" a "Estratègia" via paràmetres d'algoritme()

o bé

-- passar una referència a "Context" com a paràmetre d'algoritme()



*** Exemples d'aplicació d'aquest patró:

He trobat 2 exemples que mostren l'utilització del patró Estratègia:

Exemple 1: El patró estratègia en la generació de variables aleatòries

Aquí, la classe Context s'anomena "UnivariateDistribution" i conté l'operació nextRand(), per la que pot haver diferents comportaments. "UnivariateDistribution" té una referència a la interfície "GenerationMethod", implementada pels següents possibles comportaments de Context per nextRand(): l'algoritme de "BoxMuller1958", el de "BucketsInversion" i el de "AhrensDieter1988".


Exemple 2: Una aplicació senzilla per a fer gràfics

En aquest exemple, suposem que es tenen 2 botons i que depenent de quin es pitgi, l'aplicació mostrarà un gràfic de línies o un gràfic de barres sobre unes dades estadístiques. Aquí, l'interfície Estratègia es diu "PlotStrategy" i és implementada per "LinePlot" i "BarPlot". L'objecte "Context" decidirà quina de les dues estratègies utilitza en el moment en que l'usuari prem un dels 2 botons.



*** Alternatives a l'ús del patró Estratègia:

- Una de les alternatives possibles a l'ús d'aquest patró és fer herència directament sobre l'objecte "Context" i usar el patró "TemplateMethod", que pel que es veu, és una solució menys flexible que amb el patró Estratègia.

- Una altra alternativa també pitjor a l'ús d'estartègies per a canviar el comportament de l'objecte és el patró "FactoryMethod".



*** Bibliografia

La "bibliografia" que he usat per fer aquesta mena de recopilatori d'informació sobre el Patró Estratègia és:

http://patterndigest.com/patterns/Strategy.html

http://www.clickblocks.org/patterns1/pattern_synopses1_2ed.html

http://www.exciton.cs.rice.edu/JavaResources/DesignPatterns/StrategyPattern.htm

www.patterndepot.com/put/8/strategy.pdf

www.ub.es/stat/recerca/preprints/A%20Coruna%20febrer%2003.pdf


au salut!
 
Segons "Gang of Four"(la banda dels quatre), la intenció del el patró estratègia es : Definir una família d' algoritmes, encapsulats cadascun d' ells, i fer-los intercanviables entre ells. La estratègia permet que l' algoritme variï independentment dels clients que l' usen.

El patró estratègia està basat en pocs principis:

1- Els objectes tenen responsabilitats.

2- Les implementacions específiques d' aquestes responsabilitats es manifesten a través de l' ús del polimorfisme.

3- Hi ha la necessitat de gestionar implementacions diferents de lo que es, conceptualment, el mateix algoritme.

4- Es una bona pràctica de disseny separar comportaments que ocorren en el domini del problema de cadascun dels demés. Això permet canviar la classe responsable per a un comportament sense afectar a altres.


Bibliografia: Addison Wesley - Design Pattern Explained
 
Publica un comentari a l'entrada

<< Home

Powered by Blogger