Buscar (Don't Edit)

jueves, 27 de diciembre de 2012

Patrones de Diseño: el patrón Strategy

Hola otra vez!

Seguimos con los tutoriales sobre programación y patrones de diseño. Ahora toca el turno al patrón Strategy y, siendo fiel a la promesa de elaborar tutoriales que ejemplifiquen problemas cotidianos dentro de nuestra humilde profesión de desarrolladores, hoy nos enfocaremos en un módulo que ofrece descuentos a clientes dependiendo del tipo de cliente que sea (frecuente, habitual y ocasional).

El patrón Strategy
Éste patrón resuelve el problema que surge cuándo tenemos diferentes maneras de llevar a cabo una tarea o afrontar determinado problema. El patrón strategy permite encapsular un conjunto de algoritmos de entre los cuáles el objeto cliente pueda elegir aquel que le conviene e intercambiarlo dinámicamente según sus necesidades. La ventaja es que permite que un algoritmo varíe independientemente del cliente que lo utilice.

Aplicando descuentos a clientes utilizando el patrón Strategy
Imaginen que están desarrollando una aplicación de comercio electrónico que permite la venta de productos a clientes (¡un clásico!). Pero resulta que tu cliente (el dueño del comercio para el que desarrollaste tu aplicación) te dice que quiere una segmentación para sus distintos tipos de consumidores basada en la frecuencia de compra de éstos (imaginemos que la segmentación queda en frecuente, habitual y ocasional), pero que además necesita que el sistema pueda aplicar un descuento sobre la compra, pero que dicho descuento varíe dependiendo de la segmentación que el sistema haya hecho sobre el cliente.
Lo primero que haremos será crear una clase abstracta llamada Strategy, que será nuestra estrategia general y de la cual heredarán todas las estrategias especificas para cada tipo de descuento. La clase Strategy tendrá un método aplicarDescuentoACliente sin cuerpo, intencionalmente, con el objetivo de que las estrategias que implementen éste método lo sobreescriban con sus respectivos algoritmos de descuento. Dicho método recibirá un objeto Venta y el I.V.A. Entonces la clase queda de la siguiente manera:


Ahora crearemos las estrategias especificas para cada descuento(StrategyClienteFrecuente, StrategyClienteHabitual y StrategyClienteOcasional) que heredan de Strategy y que sobrescribirán el método aplicarDescuentoACliente con su propio algoritmo de descuento.





Lo siguiente es implementar el patrón en nuestra clase que aplicará los descuentos. Crearemos la clase Descuentos que tendrá una instancia de la clase Strategy que contendrá el algoritmo de descuento para cada tipo de cliente, además declararemos objetos Venta e I.V.A.

Escribiremos métodos que definirán el tipo de algoritmo a utilizar, aquí la idea es establecer un criterio de selección que defina cuando llamar a cada método y aplique el descuento correspondiente. Cada uno de éstos métodos creará una nueva instancia de Strategy y será la que sea implementada al momento de aplicar el descuento.

Ahora lo único que queda es escribir un método aplicarDescuento que implemente la estrategia definida por los métodos anteriores y, a través del objeto strategyDescuento, llame al método aplicarDescuentoACliente de nuestra clase Strategy. El código completo quedaría de la siguiente manera:
Ya tenemos nuestro aplicador de descuentos a clientes utilizando el patrón Strategy. Eso es todo por hoy, ¡hasta  el próximo tutorial!

1 comentario: