Вы находитесь на странице: 1из 8

Universidad Simn Bolvar

Ingeniera de Software 1

El patrn Estrategia...1

El patrn Estrategia
Alejandro Teruel
14 de mayo 2013

Presentacin
Supongamos que estamos programando un juego en el que aparecen distintos tipos de patos. Todos los
patos simulados pueden nadar y graznar. Los diseadores originales crearon una superclase para Pato y
utilizaron herencia para las especies especficas de patos:

Imgenes tomadas de Wikipedia

El cdigo que implementa graznar y nadar se encuentra asociado a la clase Pato, mientras que el
cdigo que implementa mostrarApariencia es especfica a la subclase Pato.
Los diseadores del juego deciden que quieren que se incluya, para cada pato, una animacin que
permita que los patos "vuelen". Lo primero se le ocurre a un programador nuevo es agregar la
activacin de la animacin como un nuevo mtodo volar a la clase Pato:

Universidad Simn Bolvar

Ingeniera de Software 1

El patrn Estrategia...2

Uno de los diseadores llama molesto al programador, pues resulta que ahora el juego permite que
vuelen los patos de goma! Al revisar ms detalladamente el cdigo, el programador encuentra que uno
de los herederos de Pato es una clase llamada PatoDeGoma:

Como el programador agreg el comportamiento volar al padre (Pato), inadvertidamente PatoDeGoma


hered este nuevo mtodo y vuela. La forma rpida de resolver el caso especfico del pato de goma es
sobreescribir el mtodo volar para que no haga nada (un cuerpo vaco).
Sin embargo esto no resuelve el problema de fondo. El problema de fondo se origina por la forma de
acoplamiento que presenta la herencia: la superclase no sabe quienes heredan de l, por lo que si la
modificacin que se le hace puede tener un efecto inadecuado o hasta defectuoso en alguna de las
subclases.
Una segunda (e insatisfactoria) opcin es convertir a la superclase Pato en una interfaz (en el sentido
que le da Java). Sin embargo esta solucin obliga a duplicar el cdigo correspondiente a nadar y
graznar en las clases Pato Domstico, Pato Mandarn y otras, digamos, veinte clases -lo que contradice
el principio de Una y slo una vez (evitar la duplicacin de cdigo).
Lo que requerimos es una forma de indicar que los patos tienen un comportamiento como graznar o
volar y que tal comportamiento puede variar de una subclase a otra. En lo que est subrayado est la
clave del patrn Estrategia. Creemos dos clases para separar estos comportamientos de la clase que los
posee: una clase CmoVolar y otra CmoGraznar y asocimosla a la clase Pato:

Para evitar la herencia a ciegas, convertimos CmoGraznar y CmoVolar en interfaces y definimos


distintas subclases de estos comportamientos:

Universidad Simn Bolvar

Ingeniera de Software 1

El patrn Estrategia...3

Observe tambin que agregamos dos nuevos mtodos a Pato, a_volar y a_graznar. Cuando a un Pato p
se le invoca el mtodo p.a_volar, el mtodo debe invocar el mtodo volar del objeto CmoVolar
asociado a l. Si p es, por ejemplo un PatoDeGoma, el objeto CmoVolar asociado a l debe ser un
NoPuedeVolar, por lo que no volar.
En trminos de Java, podramos definir:
public abstract class Pato {
private CmoVolar cmoVolar;
private CmoGraznar cmoGraznar;
public Pato(){
...
}
public a_volar{
cmoVolar.volar();
}
public a_graznar{
cmoGraznar.graznar(),
}
public class PatoDeGoma extends Pato {
public PatoDeGoma(){
cmoVolar = new NoPuedeVolar();
cmoGraznar = new Piar();
}
...
}
Note que esta estructura, incluso nos permitira programar un cambio del tipo de comportamiento a
tiempo de ejecucin. As, podramos agregar un mtodo que enmudece un pato de goma al que se le
daa el mecanismo de emisin de sonido:

Universidad Simn Bolvar

Ingeniera de Software 1

El patrn Estrategia...4

public class PatoDeGoma extends Pato {


...
public enmudecer(){
cmoGraznar = new Callar();
}
...
}

Para qu sirve el patrn Estrategia?


El patrn Estrategia (tambin conocido como Poltica) define una familia de algoritmos y
encapsula cada uno de los algoritmos de forma de hacerlos intercambiables. Esto permite que
el algoritmo puede variar independientemente de su cliente.
Adaptado de GOF, 1995

Estructura del patrn Estrategia

La invocacin al mtodo activarEstrategia() de un objeto Contexto invoca al mtodo


aplicarEstrategia() del objeto Estrategia que tiene.

Ejemplos adicionales

Los formateadores o compositores de texto utilizan diferentes estrategias para decidir cunto
texto acomodar en una lnea y cmo hacerlo. Las estrategias ms sencillas son las que, como
alinear a la izquierda (a la derecha) cuadran el texto en su margen izquierda (derecha), dejan
un blanco entre palabras y dejan un margen irregular a la derecha (izquierda) -aunque aqu
puede variar la estrategia en cuanto a permitir o no la divisin de palabras para llenar la lnea lo
ms posible o no. La alineacin a ambos mrgenes (alineacin justificada) suele apoyarse en
estrategias ms o menos sofisticadas para evitar lo que se llaman "ros de blanco", es decir que
los blancos que se inserten para rellenar la lnea no muestren un patrn distractor de blancos.
Ejemplo de un ro de blancos (a la izquierda, despues de la primera palabra de cada lnea).
jhjhj jkjk kjk kjk kjkj jk
lklk kllkll klk kl kllkl kl
jkjk jkj jkjk jkk kjk kk
kj jj kjkj kj jkkjk ioi i

Universidad Simn Bolvar

Ingeniera de Software 1

El patrn Estrategia...5

De all que el uso del patrn permite que objetos de la clase cliente LneaDeTexto se apoyan
sobre objetos tipo EstrategiaDeAlineacin, una clase que, en una doble aplicacin del patrn, a
su vez podra apoyarse sobre una clase EstrategiaDeRelleno.

El patrn se ha utilizado en aplicaciones financieras que distinguen entre el


InstrumentoFinanciero y la EstrategiaDeInversin o incluso la estrategia de
ClculoDeRetornoSobreLaInversin:
Por ejemplo, los bonos pblicos venezolanos son instrumentos financieros respaldados por la Repblica
Bolivariana de Venezuela. Los principales Bonos Pblicos del Estado Venezolano en el mercado de
valores incluyen letras del tesoro, bonos de la deuda pblica nacional, bonos soberanos, bonos de PDVSA,
vebonos., bonos Brady y bonos cero cupn1.
Los Estados emiten bonos para obtener capital a corto plazo, prometindole al inversor retornarle el
capital con un inters que puede variar segn el desempeo que logre el Estado. En el mercado de
capitales estos bonos se pueden compran y vender varias veces despus que hayan sido emitidos y antes
de que maduren (se cumpla el plazo). El valor de reventa de un bono depende del riesgo que se asocie al
bono en un momento dado, haciendo que el bono se venda a un porcentaje determinado de su valor oficial.
Las estrategias de compra y venta de bono toman en cuenta factores como la inflacin, el desempeo
estimado o reportado por el Estado, los distintos riesgos percibidos sobre la credibilidad o el desempeo
final del Estado, la historia previa de emisiones de bonos similares, la cercana del plazo de madurez y los
objetivos que persigue el inversor con esos bonos, entre otros2.

En software de apoyo al diseo de circuitos electrnicos se distinguen y separan distintas


estrategias para posicionar y rutear las conexiones entre los componentes de un circuito.

Se ha aprovechado el patrn para encapsular estrategias de validacin de campos de entradas de


datos. Cada campo de entrada de datos (el cliente) puede asociarse a una de varias estrategias de
validacin, tales como validacin de que el valor que se introduzca est dentro de un rango o
que corresponda a un valor previamente almacenado.

Las clases CheckedInputStream y CheckedOutputStream en el paquete java.util.zip pueden


recurrir a algoritmos distintos de validacin de dgitos de chequeo. La clase Adler32 y la clase
CRC32 encapsulan algoritmos (estrategias) diferentes de la interfaz Checksum. Vale la pena
destacar que CheckedInputStream y CheckedOutputStream tienen constructores que incluyen un
parmetro de tipo Checksum.

Un ejemplo interesante surge en el dominio de las reservaciones.Cuando se reserva un recurso limitado


como lo puede ser espacio en un buque de carga, asientos en un vuelo o para una funcin de teatro, o
cupos para estudiar en una universidad o inscribirse en una asignatura electiva, desde el punto de vista
del administrador de los recursos surgen dos grandes lneas de estrategias:

Permitir reservar slo hasta la capacidad mxima. Esto le garantiza el recurso a quien hace la
reservacin, pero puede dejar cupos sin usar por cancelaciones o cambios de ltima hora. Para
no dejar tales cupos vacos se implementa entonces una poltica de lista de espera.

Permitir reservar por encima de la capacidad mxima (sobre-venta). Tpicamente esto involucra
estimar un "sobrecupo" (cuntos cupos adicionales se pueden reservar) fundamentado en la tasa
estimada de reservaciones que se dejan de usar que puede llegar a ser de 10 al 20% de la
capacidad. En este caso el riesgo ms grave suele ser que cancele menos personas que lo que se
estim -en cuyo caso se requiere un mecanismo que permita atender o compensar a todos los

1 http://www.josebhuerta.com/bonos.htm
2 http://www.investinginbonds.eu/pages/LearnAboutBonds.aspx?folder_id=376

Universidad Simn Bolvar

Ingeniera de Software 1

El patrn Estrategia...6

que se presenten con reservaciones vlidas pero que se quedaron sin cupo.
En Venezuela, la mayora de las universidades oficiales utilizan como parte de su estrategia de asignacin
de cupo, la reserva de cupo mximo aunado a listas de espera, mientras que la Universidad Simn Bolvar
ha venido utilizando una estrategia de sobrecupo de admisin con el entendimiento que si la tasa de nomatriculacin es mayor que lo estimado, la Universidad corre con las consecuencias de admitir ese
nmero mayor de estudiantes. Histricamente la estabilidad de la tasa de no-matriculacin ha resultado ser
extraordinariamente estable.

De esta manera una aplicacin de reservacin de carga por buque, puede encontrarse con que un
mtodo reservar requiere asociar a un viaje de un buque una cierta cantidad de carga:

La discusin anterior sugiere claramente la aplicabilidad del patrn Estrategia:

Cundo debe considerarse el patrn?


1. Cuando aparecen muchas clases similares que varan slo en su comportamiento (en cmo
implementan uno o ms mtodos);
2. Cuando se necesita ofrecer variantes de un mismo algoritmo. Los algoritmos pueden que varen
en cunto a diferentes tipos de requerimientos de tiempo, memoria u otros recursos
computacionales, pueden variar debido a una base heurstica que se comporta mejor en ciertas
circunstancias que en otras, o en cuanto al nfasis que pone sobre la satisfaccin de un objetivo

Universidad Simn Bolvar

Ingeniera de Software 1

El patrn Estrategia...7

u otro en funciones multi-objetivo.


3. Cuando se requiere ocultar del cliente algunas estructuras complejas muy especficas a un
algoritmo u otro.
4. Cuando una clase define muchos comportamientos alternos y se duplica cdigo para activar el
comportamiento ms indicado a unas circunstancias dadas.

Consideraciones especiales
1. Puede complicar el mantenimiento de un software debido a que se tienen que entender bien los
pros y contras de las estrategias para poder seleccionar la ms adecuada para un cliente en su
contexto de uso. Note que un contexto extremo, el cliente puede requerir aplicar un proceso
licitatorio para poder seleccionar la estrategia de mayor potencial o podra solicitar la ejecucin
provisional o especulativa de varias estrategias, en paralelo, para decidir con cul
comprometerse. Tanto el uso de licitaciones como la ejecuccin paralela especulativa requiere
extender el patrn Estrategia o combinarlo con otros patrones.
2. El acoplamiento entre el cliente y la estrategia. Algunas de las estrategias pueden ser mucho
ms sencillas que otras y requerir de menos informacin que otras. Sin embargo el patrn
requiere, en principio que se enven los mismos parmetros a todas las estrategias, lo que atenta
contra el principio de acoplamiento dbil de pasar el mnimo de informacin requerida adems
de ser una posible fuente de ineficiencia (se pasan innecesariamente parmetros que no se
usan). La solucin puede requerir pasar de un esquema de empuje (push) donde el cliente enva
toda la informacin a un esquema mixto tipo empuje y hala (push-pull) donde el cliente enva el
mnimo comn a las estrategias pero las estrategias que as lo requieran puedan solicitar la
informacin adicional que les haga falta para ejecutar correctamente. Para que una estrategia
que hale tenga sentido, la estrategia requiere o bien recibir una referencia a su cliente para
poder dirigirle solicitudes de informacin adicional o tenerla almacenada.

Ejercicios
1. Tenemos la opcin de expeditar rdenes. Expeditar puede considerarse un ejemplo de
Estrategia? Cul podra ser la clase cliente?
2. El 3 de noviembre del 2010, en su blog Tratando de entenderlo Jorge propone el siguiente
ejemplo para introducir el patrn Estrategia3. Analice la propuesta, ejemplifica correctamente
el uso del patrn?
En un banco existen distintos tipos de cuentas, para las cules se siguen distintos algoritmos a
la hora de calcular sus rendimientos anuales. Un objeto encargado de calcular los
rendimientos de las cuentas (en este ejemplo, ste sera el objeto de contexto) podra utilizar
distintas estrategias para calcular el rendimiento de cada tipo de cuenta.
El siguiente diagrama representa el ejemplo anterior:

3 http://tratandodeentenderlo.blogspot.com/2010/11/patrones-de-diseno-strategy.html Consultado 14 mayo 2013.

Universidad Simn Bolvar

Ingeniera de Software 1

El patrn Estrategia...8

Lecturas adicionales

Eric Freeman, Elizabeth Freeman: Head First Design Patterns. OReilly, 2004. Excelente y
divertida explicacin del patrn Estrategia en el Captulo 1. El ejemplo de los patos es tomado,
con muy pequeas modificaciones de esta referencia.

[GOF, 1995] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns:
Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995. Este fue el primer libro
publicado sobre patrones de diseo y sigue conservando su vigencia. Las secciones Para qu
sirve el Patrn Estrategia, Estructura del Patrn Estrategia, Otros Ejemplos corresponden,
a material que se encuentra en la seccin Strategy del captulo 5 (Behavioral Patterns) del
libro.

Eric Evans: Domain-Driven Design. Addison-Wesley, 2004. El ejemplo de las reservaciones de


carga naviera ha sido adaptada de un ejemplo que se presenta en el captulo 1 del libro.

Daniel Childs (Webbiscuit): Design Patterns Part 1 -The Strategy Pattern.


http://www.codeproject.com/Articles/52807/Design-Patterns-Part-1-The-Strategy-Pattern 17 de
enero 2010 (consultado 14 de mayo 2013).

Mark Grand: Patterns in Java: Volume 1. Wiley, 1998. Es otro libro que introduce el patrn
Estrategia, esta vez apoyndose la identificacin de das especiales segn diferentes tradiciones
(feriados bancarios, feriados oficiales venezolanos, feriados oficiales colombianos, das
especiales para la fe juda, la f musulmana o la f catlica). Adicionalmente le debo el ejemplo
del el uso del patrn Estrategia en el paquete java.util.zip4

http://www.oodesign.com/strategy-pattern.html (Consultado 14 de mayo 2013). Otra


introduccin al patrn, esta vez apoyada en estrategias de comportamiento (agresivo, defensivo,
normal) para robots.

4 http://docs.oracle.com/javase/6/docs/api/java/util/zip/package-summary.html

Вам также может понравиться