Patrón de diseño: Strategy + Interfaz y Polimorfismo


Antes de empezar, hemos de entender un poco los términos de Interfaz y Polimorfismo:

  • Interfaz:

Una interfaz no es más que una clase que tiene todos sus métodos sin implementar. Sólo con la definición del método. Aquellas clases que implementen a ésta, tendrán que definir la implementación de dichos métodos.

Difiere de una clase abstracta, en que en ésta última, puede haber métodos implementados y otros que no. Con el fin de que las clases que hereden/extiendan de ésta última, los implementen. Si una clase contiene uno o más métodos abstractos, está clase debe ser abstracta.

ATENCIÓN:
– Las clases que hereden de la clase abstracta deben implementar todos los métodos abstractos.
– Se debe tener presente que las clases abstractas sí pueden heredar de otras clases.
– La número de parámetros de los métodos, así como el tipo de dato de los mismos, deben respetarse o de lo contrario se está hablando de otro método totalmente diferente (sobrecarga de métodos).
– En Java, una sub-clase puede heredar de sólo UNA Super-Clase pero puede implementar varias interfaces (herencia múltiple).

  • Polimorfismo:

El polimorfismo, de manera sencilla, se refiere a que dos (o más) objetos instanciados de distintas clases (por ejemplo, instancias de las clases “Gaviota” y “Perro”, que heredan de “Animal”) puedan interpretar el mismo mensaje (método “muévete()”), aunque lo que realicen cuando reciben ese mensaje sea distinto (uno vuela y el otro anda).

El polimorfismo en esencia se refiere al comportamiento de los objetos, no a su pertenencia a una jerarquía de clases (o a sus tipos de datos).

  • Patrón Strategy:

El patrón Estrategia o Strategy, es un patrón de diseño, que se clasifica como patrón de comportamiento porque determina cómo se debe realizar el intercambio de mensajes entre diferentes objetos para resolver una tarea. El patrón estrategia permite mantener un conjunto de algoritmos de entre los cuales el objeto cliente puede elegir aquel que le conviene e intercambiarlo dinámicamente según sus necesidades.

En el patrón intervienen 3 participantes:

  1. Contexto (Context): Es el elemento que usa los algoritmos. Configura una estrategia concreta mediante una referencia a la estrategia necesaria. Puede definir una interfaz que permita a la estrategia el acceso a sus datos en caso de que fuese necesario el intercambio de información entre el contexto y la estrategia. En caso de no definir dicha interfaz, el contexto podría pasarse a sí mismo a la estrategia como parámetro.
  2. Estrategia (Strategy): Declara una interfaz común para todos los algoritmos soportados. Esta interfaz será usada por el contexto para invocar a la estrategia concreta.
  3. EstrategiaConcreta (ConcreteStrategy): Implementa el algoritmo utilizando la interfaz definida por la estrategia.

Patrón Strategy

Aplicado a un ejemplo en PHP, imaginemos que queremos conectarnos a una base de datos, pero no sabemos si va a ser Oracle o MySQL (podría haber tantas como quisiéramos). El usuario elegirá en un formulario las opciones de bases de datos que se especifiquen en un desplegable, pasando por POST el parámetro “dbms”.