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
¿Qué son los patrones de diseño?. El patrón Singleton. El patrón Registry El patrón Factory. El patrón Decorator El patrón Observer. El patrón Front Controller. El patrón MVC
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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
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
Desarrollo web avanzado con PHP 5
2.1. ¿Qué son los patrones de diseño?
Bloque II: Patrones de diseño
Son soluciones a problemas cotidianos, son independientes de la tecnología utilizada y permiten crear un argot común.
Desarrollo web avanzado con PHP 5
2.1. ¿Qué son los patrones de diseño?
Bloque II: Patrones de diseño
Un poco de historia:
● En 1977 Christopher Alexander aplica en concepto de patrón (“pattern”) a la arquitectura.
● En 1987 Kent Beck y Ward Cunningham se plantean aplicar este concepto de patrón 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 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
Desarrollo web avanzado con PHP 5
2.2. El patrón Singleton
Bloque II: Patrones de diseño
Problema
Tener acceso a un recurso único que nunca sea duplicado y que además esté disponible en cualquier parte de la aplicación, sin tener que preocuparse de su existencia.
Desarrollo web avanzado con PHP 5
2.2. El patrón Singleton
Bloque II: Patrones de diseño
Ejemplo
Necesitar instanciar un objeto que nos de acceso a la base de datos, pero que nos devuelva siempre la misma conexión.
Desarrollo web avanzado con PHP 5
2.2. El patrón Singleton
Bloque II: Patrones de diseño
Implementación
class DB{
private static $singleton; private $connection; private function __construct(){
$this>conection = mysql_connect();
}
public static function getInstance(){ if(is_null(self::$singleton){ self::$singleton = new DB(); } return self::$singleton; }}
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
Desarrollo web avanzado con PHP 5
2.3. El patrón Registry
Bloque II: Patrones de diseño
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 patrón Registry
Bloque II: Patrones de diseño
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 patrón Registry
Bloque II: Patrones de diseño
Implementacion
class Registry{
private static $register;
public static function add($item){ if(is_object($item)){
$name = get_class($item);
}else{throw new Exception('Objeto incorrecto');
} self::$register[$name] = $item; }
Desarrollo web avanzado con PHP 5
2.3. El patrón Registry
Bloque II: Patrones de diseño
Implementación (continuación)
public static function get($name){if(array_key_exists($name, self::$register)){
return self::$register[$name]; }else{
throw new Exception('Clase no registrada');
} }}
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
Desarrollo web avanzado con PHP 5
2.4. El patrón Factory
Bloque II: Patrones de diseño
Problema
Necesitamos instanciar una o más clases especializadas que se encargan de hacer la misma tarea.
Desarrollo web avanzado con PHP 5
2.4. El patrón Factory
Bloque II: Patrones de diseño
Ejemplo
Necesitamos cargar los parámetros de configuración de nuestra aplicación, pero estos podrán provenir de un XML o un archivo en PHP.
Desarrollo web avanzado con PHP 5
2.4. El patrón Factory
Bloque II: Patrones de diseño
Solución
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
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Problema
Permitir herencia múltiple evitando que el árbol de clases crezca de manera desmesurada.
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Estamos programando un juego de estrategia y creamos una clase “Tile” (tesela) para el mapa. Cada tesela permite una velocidad.
abstract class Tile{
abstract function getSpeed();}
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Para crear una “Montaña” (Mountain) bastará con esto
class Mountain extends Tile{ private $speed = 10;
function getSpeed(){return $this>speed;
}}
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Y si queremos que la montaña esté congelada
class FrozenMountain extends Mountain{
function getSpeed(){return parent::getSpeed() + 2;
}}
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Y si ahora queremos que la montaña esté embarrada
class MuddyMountain extends class Mountain{
function getMoveRate(){return parent::getSpeed() 2;
}}
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Y si necesitamos una montaña embarrada y congelada
Y si ahora también tenemos explanadas
Y si también pueden estar atravesadas por ríos
...
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
El secreto para resolver correctamente este problema se basa en delegar responsibilidades.
Seguimos manteniendo las primeras clases del árbol
class Mountain extends class Tile{ private $speed = 10;
function getMoveRate(){return $this>speed;
}} abstract class Tile{
abstract function getSpeed();}
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Creamos una nueva clase encargada de “decorar”
abstract class TileDecorator extends Tile{
protected $tile;
function __construct(Tile $tile){$this>tile = $tile;
}}
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Redefinimos nuestras clases “Congelada” y “Embarrada”
class MuddyDecorator extends TileDecorator{
function getSpeed(){return $this>tile>getSpeed()2;
}}
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Redefinimos nuestras clases “Congelada” y “Embarrada”
class FrozenDecorator extends TileDecorator{
function getSpeed(){return $this>tile>getSpeed()+2;
}}
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Creando una Montaña Congelada
$tile = new FrozenDecorator( new Mountain() );
return $title>getSpeed() // 12
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Creando una explanada congelada y embarrada
$tile = new MuddyDecorator( new FrozenDecorator( new Plain() ) );
return $title>getSpeed() // 10
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
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
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Problema
Una clase adquiere responsabilidades que no le son específicas como consecuencia de un evento que sucede en su interior
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Ejemplo
Consideremos una clase responsable del acceso de usuarios al sistema
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Ejemploclass Login{ const LOGIN_GRANTED = 1; const LOGIN_DENIED = 2; private $status = array(); public function handleLogin($user, $pass, $ip){