Patrón de diseño: Estrategia ( strategy pattern ) en php

Enviado por Francisco Carrizales el Jue, 05/10/2017 - 18:44

El patrón Estrategia es sin duda alguna maravilloso,  en el momento que conoces, comprendes  e implementas, tu vida como programador cambia radicalmente,  sin mas  tratare de explicar en que consiste el patrón de diseño Estrategia en php.

La idea principal es la siguiente, tener en mente  la palabra “Comportamiento” que es prácticamente lo que describe su funcionamiento y su uso. Cuando hay que usarlo, en el momento en el que tienes unos datos de entrada  y tienes un instrucción que ejecutar con estos datos. (fig1)Pero por x o y razón con estos mismo datos también puedes ejecutar otro conjunto de instrucciones.( fig2)


 



 












 

Quedando definido como uml de la siguiente manera:

 


 

Pero siempre que buscas información vemos este diagrama, bueno como yo aprendo a base de ejemplos, aquí vamos  con algo con algo que lo comprendí.

 

En el área de desarrollo por lo regular siempre nos solicitan la realización de reportes de todo tipo barras, pastel. Y siempre la clásica quiero que lo exportes a Excel.  Por lo que nuestro ejemplo es generar un reporte.


 

Viendo el patrón descrito como diagrama, procedemos a realizar el nuestro. Recordando que vamos a hacer reportes. ( Si reportes -_- todo mundo quiere reportes).




 

Pues bien, ya tenemos nuestro diagrama (a codear ò_ó). Procedemos a crear las clases y la interface.

 

Bien crearemos una interfaces llamada Estrategia, posteriormente las implementaciones “ReporteBarra” y “ReporteExportacionExcel” que como se aprecia encapsulara las instrucciones para que en base a los datos generar su correspondiente reporte. Y ya por ultimo la clase de contexto “Reporte”  para finalizar con la implementación.

 

La variable $datos se supone que obtendrá  los registros de la base de datos.  Y se los entregara a cada estrategia.

 

Lo que se muestra es la ventaja de utilizar el patrón  pues lograremos con los mismo datos generar varios reportes. (y si generar otro tipo de reporte con los mismo datos. O exportarlos a pdf.)  incluso poder controlar que reporte visualizar.  Solo añadiendo la estrategiaCorrecta.

<?php
interface Estrategia {
  function hacerReporte();
}

Después hacer nuestras Estrategias:

class ReporteBarra implements Estrategia
{
    private $datos;
    public function __construct($datos)
    {
        $this->datos = $datos;
    }

    public function hacerReporte()
    {
        echo "Magia negra de programación para realizar una grafica de barra con los Datos<br>";
    }
}

class ReporteExportacionExcel implements Estrategia
{
    private $datos;

 

    public function __construct($datos)
    {
        $this->datos = $datos;
    }

    public function hacerReporte()
    {
        echo  "Magia negra de programación para realizar una archivo de excel con los Datos<br>";
    }
}

 

Y por último nuestro contexto.


class Reporte
{
    private $estrategia;

    private $datos;

 

    public function __construct($datos)
    {
        $this->datos = $datos;
    }

 

    public function setEstrategia(Estrategia $estrategia)
    {
        $this->estrategia = $estrategia;
    }

 

    public function ejecutar()
    {
        $this->estrategia->hacerReporte();
    }
}


 

Ya para finalizar  la implementación


$datos = array();
$reporte = new Reporte($datos);
$reporte->setEstrategia(new ReporteBarra($datos));
$reporte->ejecutar();
$reporte->setEstrategia(new ReporteExportacionExcel($datos));
$reporte->ejecutar();




 

Etiquetas

Comments

como instanciaste $reporte = new Reporte( ); sin pasarle el parametro siendo que el constructor de Reporte pide $dato como argumento?

Francisco Carrizales

Sáb, 04/04/2020 - 21:19

En respuesta a por nahuel (no verificado)

Pues si este ejemplo lo hice hace mucho tiempo y no habia visto ese error

 

<?php


$datos = array();
$reporte = new Reporte($datos);
$reporte->setEstrategia(new ReporteBarra($datos));
$reporte->ejecutar();
$reporte->setEstrategia(new ReporteExportacionExcel($datos));
$reporte->ejecutar();

 

Añadir nuevo comentario

HTML Restringido

  • Etiquetas HTML permitidas: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Saltos automáticos de líneas y de párrafos.
  • Las direcciones de correos electrónicos y páginas web se convierten en enlaces automáticamente.