Beruflich Dokumente
Kultur Dokumente
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:
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:
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:
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:
Ingeniera de Software 1
El patrn Estrategia...4
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
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.
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
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:
Ingeniera de Software 1
El patrn Estrategia...7
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:
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.
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
4 http://docs.oracle.com/javase/6/docs/api/java/util/zip/package-summary.html