Patrones de Diseño

64
  Desarrollo web avanzado con PHP5 Bloque II: Patrones de diseño 1. ¿Qué son los patrones de diseño? 2. El patrón Singleton 3. El patrón Registry 4. El patrón Factory 5. El patrón Decorator 6. El patrón Observer 7. El patrón Front Controller 8. El patrón MVC

description

php

Transcript of Patrones de Diseño

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP 5

    2.1. Qu son los patrones de diseo?

    Bloque II: Patrones de diseo

    Son soluciones a problemas cotidianos, son independientes de la tecnologa utilizada y permiten crear un argot comn.

  • Desarrollo web avanzado con PHP 5

    2.1. Qu son los patrones de diseo?

    Bloque II: Patrones de diseo

    Un poco de historia:

    En 1977 Christopher Alexander aplica en concepto de patrn (pattern) a la arquitectura.

    En 1987 Kent Beck y Ward Cunningham se plantean aplicar este concepto de patrn al sofware

    En 1994 se publica Design Patterns: Elements of Reusable Object-Oriented Software por la Gang Of Four (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP 5

    2.2. El patrn Singleton

    Bloque II: Patrones de diseo

    Problema

    Tener acceso a un recurso nico que nunca sea duplicado y que adems est disponible en cualquier parte de la aplicacin, sin tener que preocuparse de su existencia.

  • Desarrollo web avanzado con PHP 5

    2.2. El patrn Singleton

    Bloque II: Patrones de diseo

    Ejemplo

    Necesitar instanciar un objeto que nos de acceso a la base de datos, pero que nos devuelva siempre la misma conexin.

  • Desarrollo web avanzado con PHP 5

    2.2. El patrn Singleton

    Bloque II: Patrones de diseo

    Implementacin

    classDB{

    privatestatic$singleton;private$connection;privatefunction__construct(){

    $this>conection=mysql_connect();

    }

    publicstaticfunctiongetInstance(){if(is_null(self::$singleton){self::$singleton=newDB();}returnself::$singleton;}}

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP 5

    2.3. El patrn Registry

    Bloque II: Patrones de diseo

    Problema

    Permitir que cualquier objeto sea usado como un Singleton sin necesidad de especificarlo directamente en su constructor

  • Desarrollo web avanzado con PHP 5

    2.3. El patrn Registry

    Bloque II: Patrones de diseo

    Ejemplo

    Crear un objeto que sea una base de datos que se pueda recuperar como si fuera un singleton.

  • Desarrollo web avanzado con PHP 5

    2.3. El patrn Registry

    Bloque II: Patrones de diseo

    Implementacion

    classRegistry{

    privatestatic$register;

    publicstaticfunctionadd($item){ if(is_object($item)){

    $name=get_class($item);

    }else{thrownewException('Objetoincorrecto');

    }self::$register[$name]=$item;}

  • Desarrollo web avanzado con PHP 5

    2.3. El patrn Registry

    Bloque II: Patrones de diseo

    Implementacin (continuacin)

    publicstaticfunctionget($name){if(array_key_exists($name,self::$register)){

    returnself::$register[$name];}else{

    thrownewException('Clasenoregistrada');

    }}}

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP 5

    2.4. El patrn Factory

    Bloque II: Patrones de diseo

    Problema

    Necesitamos instanciar una o ms clases especializadas que se encargan de hacer la misma tarea.

  • Desarrollo web avanzado con PHP 5

    2.4. El patrn Factory

    Bloque II: Patrones de diseo

    Ejemplo

    Necesitamos cargar los parmetros de configuracin de nuestra aplicacin, pero estos podrn provenir de un XML o un archivo en PHP.

  • Desarrollo web avanzado con PHP 5

    2.4. El patrn Factory

    Bloque II: Patrones de diseo

    Solucin

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Problema

    Permitir herencia mltiple evitando que el rbol de clases crezca de manera desmesurada.

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Ejemplo

    Estamos programando un juego de estrategia y creamos una clase Tile (tesela) para el mapa. Cada tesela permite una velocidad.

    abstractclassTile{

    abstractfunctiongetSpeed();}

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Ejemplo

    Para crear una Montaa (Mountain) bastar con esto

    classMountainextendsTile{private$speed=10;

    functiongetSpeed(){return$this>speed;

    }}

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Ejemplo

    Y si queremos que la montaa est congelada

    classFrozenMountainextendsMountain{

    functiongetSpeed(){returnparent::getSpeed()+2;

    }}

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Ejemplo

    Y si ahora queremos que la montaa est embarrada

    classMuddyMountainextendsclassMountain{

    functiongetMoveRate(){returnparent::getSpeed()2;

    }}

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Ejemplo

    Y si necesitamos una montaa embarrada y congelada

    Y si ahora tambin tenemos explanadas

    Y si tambin pueden estar atravesadas por ros

    ...

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Ejemplo

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Implementacin

    El secreto para resolver correctamente este problema se basa en delegar responsibilidades.

    Seguimos manteniendo las primeras clases del rbol

    classMountainextendsclassTile{private$speed=10;

    functiongetMoveRate(){return$this>speed;

    }} abstractclassTile{

    abstractfunctiongetSpeed();}

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Implementacin

    Creamos una nueva clase encargada de decorar

    abstractclassTileDecoratorextendsTile{

    protected$tile;

    function__construct(Tile$tile){$this>tile=$tile;

    }}

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Implementacin

    Redefinimos nuestras clases Congelada y Embarrada

    classMuddyDecoratorextendsTileDecorator{

    functiongetSpeed(){return$this>tile>getSpeed()2;

    }}

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Implementacin

    Redefinimos nuestras clases Congelada y Embarrada

    classFrozenDecoratorextendsTileDecorator{

    functiongetSpeed(){return$this>tile>getSpeed()+2;

    }}

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Implementacin

    Creando una Montaa Congelada

    $tile=newFrozenDecorator(newMountain());

    return$title>getSpeed()//12

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Implementacin

    Creando una explanada congelada y embarrada

    $tile=newMuddyDecorator(newFrozenDecorator(newPlain()));

    return$title>getSpeed()//10

  • Desarrollo web avanzado con PHP 5

    2.5. El patrn Decorator

    Bloque II: Patrones de diseo

    Implementacin

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Problema

    Una clase adquiere responsabilidades que no le son especficas como consecuencia de un evento que sucede en su interior

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Ejemplo

    Consideremos una clase responsable del acceso de usuarios al sistema

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    EjemploclassLogin{constLOGIN_GRANTED=1;constLOGIN_DENIED=2;private$status=array();publicfunctionhandleLogin($user,$pass,$ip){

    switch(rand(1,2)){case1:

    $this>setStatus(self::LOGIN_GRANTED,$user,$ip);$ret=true;break;

    case2: $this>setStatus(self::LOGIN_DENIED,$user,$ip);

    $ret=false;break;

    }return$ret;}}

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Ejemplo

    La clase Login tendra adems su correspondiente getter y setter del atributo status

    classLogin{

    //codigoanterior

    publicfunctiongetStatus(){return$this>status;

    }

    publicfunctionsetStatus($status,$user,$ip){$this>status=array($status,$user,$ip);

    }}

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Ejemplo

    A las dos semanas de empezar a desarrollar el proyecto nos hacen una ampliacin de los requisitos

    Necesitamos que cada vez que un usuario intente acceder al sistema se registre su ip de acceso

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    EjemploclassLogin{

    //codigo

    publicfunctionhandleLogin($user,$pass,$ip){switch(rand(1,2)){

    //cdigo}

    Logger::logIP($user,$ip,$this>getStatus());

    return$ret;}}

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Ejemplo

    Un mes despus, la ampliacin de requisitos contina

    En caso de un intento de login fallido necesitamos que el sistema enve un email de notificacin

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    EjemploclassLogin{//codigopublicfunctionhandleLogin($user,$pass,$ip){switch(rand(1,2)){

    //cdigo}

    Logger::logIP($user,$ip,$this>getStatus());

    if(!$ret){ Notifier::mailWarning($user,$ip,$this>getStatus());}

    return$ret;}}

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Ejemplo

    Tras quince das de calma, vuelven a solicitar nuevos cambios

    Necesitamos aadir una cookie a aquellos usurios que s que consigan acceder al sistema.

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Implementacin

    Desenganchamos los elementos clientes (observadores) de la clase central (observable o sujeto).

    Los observadores son notificados por el sujeto de qu evento tiene lugar

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Implementacin

    La interfaz IObservable

    interfaceIObservable{

    functionattach(Observer$observer);

    functiondetach(Observer$observer);

    functionnotify();

    }

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    ImplementacinclassObservableimplementsIObservable{private$observers;

    functionattach(Observer$observer){$this>observers[]=$observer;};

    functiondetach(Observer$observer){$key=array_search($this>observers,$observer);unset($this>observers[$key]);};

    functionnotify(){foreach($this>observersas$observer){$observer>update($this);}}}

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Implementacin

    La interfaz IObserver

    interfaceIObserver{

    functionupdate(Observable$observable);

    }

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    ImplementacinclassLoginextendsObservable{//codigopublicfunctionhandleLogin($user,$pass,$ip){switch(rand(1,2)){

    //cdigo}

    $this>notify();

    return$ret;}}

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    Implementacin

    A las dos semanas de empezar a desarrollar el proyecto nos hacen una ampliacin de los requisitos

    Necesitamos que cada vez que un usuario intente acceder al sistema se registre su ip de acceso

  • Desarrollo web avanzado con PHP 5

    2.6. El patrn Observer

    Bloque II: Patrones de diseo

    ImplementacinclassLoggerimplementsObserver{

    //otrocdigo

    functionupdate(Observable$observable){$this>log($observable>getStatus());};

    }

    $login=newLogin();$login>attach(Logger::getInstance());

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP 5

    2.7. El patrn Front Controller

    Bloque II: Patrones de diseo

    Problema

    Proporcionar un nico punto de entrada para todas las peticiones

  • Desarrollo web avanzado con PHP 5

    2.7. El patrn Front Controller

    Bloque II: Patrones de diseo

    Solucin

    Todas las peticiones deben ser procesadas por un nico script, por ejemplo index.php

  • Desarrollo web avanzado con PHP 5

    2.7. El patrn Front Controller

    Bloque II: Patrones de diseo

    Ejemplo

    Tenemos una web muy simple formada por tres pantalla: Inicio, Servicios y Contacto.

  • Desarrollo web avanzado con PHP 5

    2.7. El patrn Front Controller

    Bloque II: Patrones de diseo

    Solucin

    // index.php$page=isset($_GET['page'])?_GET['page']:'inicio';

    include('pages/'.$page.'.php');

  • Desarrollo web avanzado con PHP 5

    2.7. El patrn Front Controller

    Bloque II: Patrones de diseo

    URL Amigables

    http://www.midominio.com/producto.php?id=1

    vs

    http://www.midominio.com/producto/mac-book-pro-13

    nos conformaremos con

    http://www.midominio.com/index.php?/producto/mac-book-pro-13

  • Desarrollo web avanzado con PHP5

    Bloque II: Patrones de diseo1. Qu son los patrones de diseo?

    2. El patrn Singleton

    3. El patrn Registry

    4. El patrn Factory

    5. El patrn Decorator

    6. El patrn Observer

    7. El patrn Front Controller

    8. El patrn MVC

  • Desarrollo web avanzado con PHP 5

    2.8. El patrn MVC

    Bloque II: Patrones de diseo

    El patrn MVC para una aplicacin web

    ModeloRepresenta la informacin sobre la que opera la aplicacin

    VistaMuestra la informacin del modelo, normalmente HTML

    ControladorResponde a las peticiones del usuario y actuando de pegamento entre modelo y vista

  • Desarrollo web avanzado con PHP 5

    2.8. El patrn MVC

    Bloque II: Patrones de diseo

    Un ejemplo, listando los artculos de un blog

  • Desarrollo web avanzado con PHP 5

    2.8. El patrn MVC

    Bloque II: Patrones de diseo

    Un ejemplo, listando los artculos de un blog

    //EjecutandolaSQL

    $stm=$dbh>prepare('SELECTtitle,created_atFROMarticleORDERBYcreated_atDESCLIMIT10');

    $stm>execute();

    $results=$stm>fetchAll();

    ?>

  • Desarrollo web avanzado con PHP 5

    2.8. El patrn MVC

    Bloque II: Patrones de diseo

    Un ejemplo, listando los artculos de un blog

    ListadodearticulosListadodearticulosDateTitle

  • Desarrollo web avanzado con PHP 5

    2.8. El patrn MVC

    Bloque II: Patrones de diseo

    Mejorando el cdigo

    try{$dbh=newPDO('dsn';

    }catch(Exception$e){die("Error:".$e>getMessage();}

    $stm=$dbh>prepare('SELECT*FROMarticleLIMIT10');$stm>execute();$articles=$stm>fetchAll();

    unset($dbh);

    require('view.php');

  • Desarrollo web avanzado con PHP 5

    2.8. El patrn MVC

    Bloque II: Patrones de diseo

    Mejorando el cdigo (archivo view.php)

    ListadodeartculosListadodeartculosFechaTitulo

  • Desarrollo web avanzado con PHP 5

    2.8. El patrn MVC

    Bloque II: Patrones de diseo

    Mejorando el cdigo an ms (index.php)

  • Desarrollo web avanzado con PHP 5

    2.8. El patrn MVC

    Bloque II: Patrones de diseo

    Mejorando el cdigo an ms (model.php)

    functionconnect($dsn){try{$dbh=newPDO($dsn);}catch(Exception$e){die("Error:".$e>getMessage());}return$dbh;}

    functiongetAllArticles(){$dbh=connect($dsn);$stm=$dbh>prepare('SELECT*FROMarticle');$stm>execute();$articles=$stm>fetchAll();unset($dbh);return$articles;}

    Pgina 1Pgina 2Pgina 3Pgina 4Pgina 5Pgina 6Pgina 7Pgina 8Pgina 9Pgina 10Pgina 11Pgina 12Pgina 13Pgina 14Pgina 15Pgina 16Pgina 17Pgina 18Pgina 19Pgina 20Pgina 21Pgina 22Pgina 23Pgina 24Pgina 25Pgina 26Pgina 27Pgina 28Pgina 29Pgina 30Pgina 31Pgina 32Pgina 33Pgina 34Pgina 35Pgina 36Pgina 37Pgina 38Pgina 39Pgina 40Pgina 41Pgina 42Pgina 43Pgina 44Pgina 45Pgina 46Pgina 47Pgina 48Pgina 49Pgina 50Pgina 51Pgina 52Pgina 53Pgina 54Pgina 55Pgina 56Pgina 57Pgina 58Pgina 59Pgina 60Pgina 61Pgina 62Pgina 63Pgina 64