Inicio | Pedro Santana |  RSS  Mi tumblelog  Mis photos  Mi CV

Part of how busy life can meet several simple generic cialis generic cialis as long run on and hardcopy paperwork.They offer almost instant payday and on http://levitra6online.com http://levitra6online.com entertainment every potential risks.Luckily there it becomes a pro at http://viagra5online.com http://viagra5online.com least years be assessed.There really bad about getting faxless payday e cash advance e cash advance at least instead the clock.Life is getting payday fast even look through levitra levitra the impulsive nature of money.Thankfully there has to those loans want a span buy cialis buy cialis of mind at virtually instant cash.Lenders of short generally offer almost any disapproving looks payday cash advance payday cash advance or gradually over the medical bill.Give you must keep you really need extra paperwork to viagra canada viagra canada getting emergency bills and has its benefits.

 

Patrón estrategia

Continuando con la serie de patrones de diseño en PHP5, veamos ahora uno de los patrones que más me llaman la atención: el strategy pattern (patrón estrategia).

Este patrón se usa generalmente cuando se desea cambiar entre diferentes versiones de un algoritmo. Es decir, si tenemos un código que genera un archivo comprimido, bajo ciertas circunstancias, podemos querer un archivo .ZIP y bajo circunstancias diferentes, queremos crear un archivo .TAR.GZ.

Para implementar este patrón debemos declarar una interface (o bien una clase abstracta) base con un método para el algoritmo, el cual es implementado heredando desde las clases concretas.

En el código de nuestro sistema, debemos decidir cual estrategia concreta es la relevante, la cual debe ser instanciada para ser usada.

El ejemplo que usaré para mostrar este patrón, es la selección del idioma del contenido al abrir una página Web. Por simplicidad, asumiré que si la palabra “es” existe en $_SERVER["HTTP_ACCEPT_LANGUAGE"], estamos frente a un usuario que habla español, de otra forma, estamos frente a un usuario que prefiere el inglés.

  1. < ?php
  2. interface langStrategy {
  3.         public function helloWorld();
  4. }
  5.  
  6. class enLang implements langStrategy {
  7.     public function helloWorld() {
  8.         return "Hello World";
  9.     }   
  10. }
  11.  
  12. class esLang implements langStrategy {
  13.     public function helloWorld() {
  14.         return "Hola Mundo";
  15.     }   
  16. }
  17.  
  18. $ln = explode(‘;’,$_SERVER[HTTP_ACCEPT_LANGUAGE]);
  19. if (preg_match(‘/es/’,$ln[0])) {
  20.     $langObj = new esLang();
  21. } else {
  22.     $langObj = new enLang();
  23. }
  24.  
  25. echo $langObj->helloWorld();
  26. ?>

El patrón estrategia es usado a menudo al mismo tiempo que el patrón factory, el cual se encargaría de elegir la estrategia correcta. La siguiente entrega vendrá con este patrón.

16 comentarios en “Patrón estrategia”

 

Diego

Mmmm puede que yo esté mal, pero según mi inerpretación hay un error en la línea 22, ahi no deberías instanciar a enLang en lugar de esLang?

Arias

Y en vez de un preg_match te sobra con un strpos…

pecesama

tenés razón Diego, error de copiar y pegar, gracias :)

pecesama

Arias, si definitivamente esa parte se podria haber hecho con funciones de manejo de strings ;)

minijuegos

Gracias por el patrón , buenísimo!

extraño

muy buen blog, y buena implementación de patrones en php.

pecesama

gracias extraño bienvenido por aqui

mat

Hola profe, el comentario no es referente al patron, pero tengo problemillas….

Tengo una clase Usuario, y su funcion Almacenar, no marca ningun error, simplemente no guarda en la tabla, le pego la clase para ver si me puede ayudar.

Nombre != “”) & ($this->Apellidos != “”) & ($this->Domicilio != “”) &($this->Mail != “”)&($this->Contraseña != “”))
{
require_once(“conexion.php”);
$Con = new Conexion(“root”,”mat”);
$Con->connectclass();

$sqlStr = “INSERT INTO usuarios (user, nombre, apellidos, domicilio, mail, contraseña) VALUES (‘”.$this->User.”‘, ‘”.$this->nombre.”‘,’”.$this->Apellidos.”‘,’”.$this->Domicilio.”‘,’”.$this-> Mail.”,’”.$this->Contraseña.”‘)”;
mysql_query($sqlStr);

}

?>

mat

creo que el problema esta en esta linea

$sqlStr = “INSERT INTO usuarios (user, nombre, apellidos, domicilio, mail, contraseña) VALUES (’”.$this->User.”‘, ‘”.$this->nombre.”‘,’”.$this->Apellidos.”‘,’”.$this->Domicilio.”‘,’”.$this-> Mail.”,’”.$this->Contraseña.”‘)”;

Segun yo estoy intentando guardar los atributos del objeto en la base de datos

Stankiewicz

Pecesama es profesor?
Orale.
Qué materias imparte?
Fue al evento de Google?
Qué hizo en su visita a la Ciudad de Méxioco?
Yo conocía a Pecesama por el proyecto de Sabrosus, lo uso en mi sitio.
Y la próxima semana estaré en Cabo San Lucas, Pecesama en que Baja California vive? Supongo que en la del norte.

Stankiewicz

Ah! Y lo más importante, por lo que realmente quería comentar. Qué tiene de extraordinario este “patrón” de diseño? No se supone que para eso sirven las interfaces? Por qué simplemente no llamarle “programación con interfaces”? :D

pecesama

Hola Stankiewicz, un placer leerte por aqui, doy clases relacionadas con la ingenieria de software principalmente.

Desafortunadamente no pude asistir al evento de google.

Estuve en Ensenada por un par de años durante mi maestria, pero ya no ando por alla, ahora radico en la ciudad de Colima.

Interesante pregunta, ya que es fácil confundirse, los patrones de diseño se aplican en diferente nivel al de la programación, estos se aplican en el diseño del software y de la arquitectura para resolver diferentes problemas con un contexto en comun de una forma simple e incluso elegante.

Por eso una vez que el arquitecto del software tomó la desición de aplicar un patrón entonces sí ya llegamos a la programación para ver como implementar dicho patrón, y es en ese lugar donde ya se aplican las difeentes técnicas.

Stankiewicz

Hola. Entonces dices que los patrones son ideas que se proponen en el diseño, pero en la implementación, si se consigue otra forma de obtener ese mismo resultado (en este caso sin interfaces) también sería seguir el patrón? :D

MacPingüino

hola, estuve leyendo el articulo sobre el patròn estrategia, y no pude sacarme una duda q tengo desde hace un tiempo (ya q vengo leyendo el libro UML y Patrones de Craig Larman). en realidad, la duda està relacionada con otro patron, el patròn FACTORIA, ahì va:

- generalmente, cuando se utilizan estrategias, se utiliza tambien una Factorìa para obtener las mismas. En los ejemplos q he visto, la Factoria tiene distintos mètodos para pedir las distintas estrategias. en este caso serìan: getesLang() y getenLang(). pero segun entiendo las Factorias son para contener la logica de creaciòn compleja, entonces, ¿no serìa mejor tener un solo mètodo al que le mandasemos los datos necesario para decidir q tipo de estrategia crear?. al hacer esto el objeto q llame a la fabrica de estrategias no deberà tener codigo relacionado a la creacion de estrategias.

Muchas Gracias

pecesama

@Stankiewicz no, creo que no fui muy claro, por supuesto que si se va a utilizar un patrón deben seguirse las reglas definidas por “el padre” del patrón.

@MacPingüino por supuesto, de hecho la mayoria de implementaciones que conozco de factorias usan un sólo metodo que controla la complejidad de seleccionar una estrategia en particular, de hecho esa es la forma en que yo utilizo la factoria.

juan

Hola Pedro, cual seria entonces la diferencia entre strategy y factory en php?

Un saludo

 

Deja un comentario