Videotutorial – Patrones de diseño en PHP – Chain-of-command

Para terminar la serie de screencasts sobre patrones de diseño en PHP, os enseñaré en qué consiste el chain-of-command pattern (cadena de mando), también llamado patrón cadena de responsabilidad. En él creamos una serie de objetos receptores y un objeto emisor que les envía una petición, estableciendo una cadena en la que el comando de petición recorre todos los posibles objetos receptores hasta que uno de ellos responde ejecutando el comando.

De esta manera el emisor no tiene conocimiento de qué receptor va a ejecutar el comando, favoreciendo el acoplamiento débil.

Ver screencast (duración: 8:05)

Podéis ver el resto de videotutoriales en la página de screencasts, o suscribiros al podcast de iTunes.

Ejemplo de implementación

Primero creamos el interfaz que implementarán los objetos receptores, seguido de la clase emisora CommandChain, que será la encargada de mantener la lista de instancias de los objetos receptores y pasarles las peticiones a éstos.

<?php
interface ICommand{
	function onCommand($comando, $args);
}
 
class CommandChain{
	private $_commands = array();
 
	public function addCommand($cmd){
		$this->_commands[] = $cmd;
	}
 
	public function runCommand($comando, $args){
		foreach($this->_commands as $cmd){
			if($cmd->onCommand($comando, $args)) return;
		}
	}
 
}

A continuación creamos las clases de los objetos receptores SMSCommand y MailCommand, que implementan el interfaz ICommand.

class SMSCommand implements ICommand{
	public function onCommand($comando, $args){
		if($comando!='NotifyUser' || $args['metodo']!='sms') return false;
		echo("SMSCommand ejecutando $comando. Notificando usuario ".$args['user']. " via SMS.\n");
		return true;
	}
}
 
class MailCommand implements ICommand{
	public function onCommand($comando, $args){
		if($comando!='NotifyUser' || $args['metodo']!='mail') return false;
		echo("SMSCommand ejecutando $comando. Notificando usuario ".$args['user']. " via Email.\n");
		return true;
	}
}

Finalmente, para utilizarlo instanciamos el gestor CommandChain y le añadimos los objetos receptores, para después llamar a su método runCommand que enviará el comando a dichos objetos y sólo uno de ellos responderá dependiendo de un criterio, en este caso del argumento metodo.

$c = new CommandChain();
$c->addCommand(new SMSCommand());
$c->addCommand(new MailCommand());
$c->runCommand('NotifyUser', array('metodo' => 'mail', 'user' => 'test'));

Compartir:

3 comentarios para “Videotutorial – Patrones de diseño en PHP – Chain-of-command”

  1. […] This post was mentioned on Twitter by Juan Botero, David Rojas. David Rojas said: Nuevo: Videotutorial – Patrones de diseño en PHP – Chain-of-command pattern http://bit.ly/cVsl6w […]

  2. David dice:

    Thanks for sharing the codes

  3. Juan dice:

    Solo agradecerte lo facil que haces lo complicado.

    Por favor sigue actualizando tu pagina con nuevos tutoriales.

Deja un comentario

Introduce tu información personal en el formulario, regístrate o identifícate usando twitter con el siguiente botón.

Time limit is exhausted. Please reload the CAPTCHA.

RSS iTunes podcast Twitter

Categorías

Enlaces

Archivos