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