Patrón Strategy Práctica


El parón Estrategia nos permite definir una familia de algoritmos, encapsular cada uno, y hacerlos intercambiables. Permite que un algoritmo varíe independientemente de los clientes que lo utilizan.

Objetivo: Se desea mostrar los productos al usuario dependiendo de su rol, para los usuarios clientes el listado se debe presentar por orden del precio. Por otro lado, para el administrador se requiere que se presente por orden del nombre del artículo.

Para esto debemos crear primero, según el patrón, la Interfaz que nos encapsula los dos algoritmos:

//IStrategy.php
<?php

interface IStrategy{
      function ordenar_productos();
}
?>

Ahora, creamos la implementación que cada algoritmo tiene para ordenar un producto:

//OrdenArticuloStrategy -> clase que ordena los artículos por su nombre.
<?php

require_once("IStrategy.php");
require_once("modules/productos/model/productodb.php");
require_once("modules/productos/model/producto.php");
 

class OrdenArticuloStrategy implements IStrategy{ /* ß Debe heredar de  IStrategy*/
     
      public function ordenar_productos(){
            //$pag_center = "modules/productos/view/listaproductos_view.php";
            //mostrar los artículos por articulo
            $condition = "";
            //Calcular total Registros

            $productodb = new ProductoDB();
            $numeroRegistros=$productodb->numRows($condition);
           
           
            $orden="Articulo";
            if(isset($_GET['orden']))
            $orden= $_GET['orden'];
            //////////fin elementos de orden
           
            //////////calculo de elementos necesarios para paginacion
            //tamaño de la pagina
            global $CFG_SIZE_PAGE;
            $tamPag=$CFG_SIZE_PAGE;
           
            //pagina actual si no esta definida y limites
            if(!isset($_GET["pagina"]))
            {
                  $pagina=1;
                  $inicio=1;
                  $final=$tamPag;
            }else{
                  $pagina = $_GET["pagina"];
            }
            //calculo del limite inferior
            $limitInf=($pagina-1)*$tamPag;
           
            //calculo del numero de paginas
            $numPags=ceil($numeroRegistros/$tamPag);
            if(!isset($pagina))
            {
                  $pagina=1;
                  $inicio=1;
                  $final=$tamPag;
            }else{
                  $seccionActual=intval(($pagina-1)/$tamPag);
                  $inicio=($seccionActual*$tamPag)+1;
           
                  if($pagina<$numPags)
                  {
                        $final=$inicio+$tamPag-1;
                  }else{
                        $final=$numPags;
                  }
           
                  if ($final>$numPags){
                        $final=$numPags;
                  }
            }
           
            $productos = $productodb->findPagination($condition,$orden,$limitInf,$tamPag);

            return $productos;
           
      }
}
?>


//OrdenPrecioStrategy -> clase que ordena los artículos por su precio.
<?php

require_once("IStrategy.php");
require_once("modules/productos/model/productodb.php");
require_once("modules/productos/model/producto.php");
 

class OrdenPrecioStrategy implements IStrategy{  /* ß Debe heredar de  IStrategy*/


      public function ordenar_productos(){
           
           
            //mostrar los artículos por articulo
            $condition = "";
            //Calcular total Registros

            $productodb = new ProductoDB();
            $numeroRegistros=$productodb->numRows($condition);
           
           
            $orden="Precio";
            if(isset($_GET['orden']))
            $orden= $_GET['orden'];
            //////////fin elementos de orden
           
            //////////calculo de elementos necesarios para paginacion
            //tamaño de la pagina
            global $CFG_SIZE_PAGE;
            $tamPag=$CFG_SIZE_PAGE;
           
            //pagina actual si no esta definida y limites
            if(!isset($_GET["pagina"]))
            {
                  $pagina=1;
                  $inicio=1;
                  $final=$tamPag;
            }else{
                  $pagina = $_GET["pagina"];
            }
            //calculo del limite inferior
            $limitInf=($pagina-1)*$tamPag;
           
            //calculo del numero de paginas
            $numPags=ceil($numeroRegistros/$tamPag);
            if(!isset($pagina))
            {
                  $pagina=1;
                  $inicio=1;
                  $final=$tamPag;
            }else{
                  $seccionActual=intval(($pagina-1)/$tamPag);
                  $inicio=($seccionActual*$tamPag)+1;
           
                  if($pagina<$numPags)
                  {
                        $final=$inicio+$tamPag-1;
                  }else{
                        $final=$numPags;
                  }
           
                  if ($final>$numPags){
                        $final=$numPags;
                  }
            }
            //////////creacion de la consulta con limites
            //echo "Condicion: ".$condition."<P>";
           
            $productos = $productodb->findPagination($condition,$orden,$limitInf,$tamPag);

            return $productos;
           
      }
}
?>

Los distintos algoritmos se encapsulan y el cliente trabaja contra un objeto contexto o Context. Como hemos dicho, el cliente puede elegir el algoritmo que prefiera de entre los disponibles o puede ser el mismo objeto Context el que elija el más apropiado para cada situación. En este caso, se decidió que el Context decidiera cuál era la estrategia más adecuada.

//context_controller.php

<?php
require_once("OrdenArticuloStrategy.php");
require_once("OrdenPrecioStrategy.php");

$pag_center = "modules/productos/view/listaproductos_view.php";
if($_SESSION['SES_PRIVILEGIO'] == 0){
       $obj= new OrdenArticuloStrategy();

 }else{
             $obj= new OrdenPrecioStrategy();
}

      $productos = $obj->ordenar_productos();
      $color[0]="#F3F3E9";//gris oscuro celdas
      $color[1]="#E6E6CC";//gris clarito celdas
     
      $button[0]="opbutton2";//Nombre de la clase de la css
      $button[1]="opbutton1"; //Nombre de la clase de la css
?>


Finalmente para su utilización el usuario, dependiendo del rol, accede a ver productos, y estos son ordenados con la estrategia más adecuada.