Cargando la página...

Observer Pattern - Patrón Observador

Publicado por Gastón el 13/12/2009 en PHP - Nivel Intermedio

Tabla de contenidos

Avatar de

La tabla de contenidos pertenece al artículo completo y no al contenido parcial de cada página del mismo si fuese el caso.

Leer los comentarios.

Resúmen

Ejemplo del patrón Observador (Observer Pattern) en PHP.
Definición de clases del patrón, clases concretas y ejemplo.

Sobre el autor

Avatar de gaston

Gastón tiene 29 años, vive en Argentina / Santa Fe / Santa Fe y su ocupación es Desarrollador de aplicaciones web.

Forma parte del club desde el 19/10/2009 habiendo estado en linea hace 6 días a las 01:23 por última vez.

Ha publicado 4 artículos en clubdesarrolladores con un promedio de valoración de 7.40 puntos. Puedes visitar su sitio web en http://www.devstudios.com.ar

Estadísticas

  • Leido 915 veces
  • Valorado 0.00 puntos

Observer Pattern



El patrón de diseño Observer Pattern es muy útil para informar eventos o notificaciones de algún tipo entre clases relacionadas.

/res/userimages/2259/132-observer-pattern-uml.jpg

Código Fuente

Definición de las clases e interfaces necesarias para modelar el patrón de diseño Observer Pattern en PHP

<?php

/**
* @author Gastón (clubdesarrolladores.com)
* @copyright 2008
*/

interface Observer
{
public function notify($sender, $params);
}

abstract class Observable
{
protected $observers;
public function __construct()
{
$this->observers = array();
}
public function registerObserver(Observer$observer)
{
if(!in_array($observer, $this->observers))
{
$this->observers[] = $observer;
}
}
public function unregisterObserver(Observer$observer)
{
if(in_array($observer, $this->observers))
{
$key = array_search($observer, $this->observers);
unset($this->observers[$key]);
}
}
abstract public function notifyObservers();
}

?>


Clase Textarea y sus listeners



Auditaremos un Textarea a fin de logear la tecla presionada y el momento del evento.

<?php
class Textarea extends Observable {
private $text;

public function __construct()
{
parent::__construct();
$this->text = '';
}

public function notifyObservers() {
foreach($this->observers as $observer) {
$observer->notify($this, $this->params);
}
}

public function keyPress($key) {
$this->text.= $key;
$this->params = array(
'timestamp' => time(),
'key' => $key,
);
$this->notifyObservers();
}

public function getText()
{
return $this->text;
}
}

class KeyLogger implements Observer
{
public function notify($sender, $params) {
echo ' : ', $params['key'], PHP_EOL;
}
}

class TimestampLogger implements Observer
{
public function notify($sender, $params) {
echo date('h:i:s', $params['timestamp']);
}
}
?>


Código fuente uso



Utilizar este patrón de diseño es muy simple de implementar

<?php
$textarea = new Textarea();
$textarea->registerObserver(new TimestampLogger());
$textarea->registerObserver(new KeyLogger());

$textarea->keyPress('C');
sleep(1);
$textarea->keyPress('L');
sleep(2);
$textarea->keyPress('U');
sleep(1);
$textarea->keyPress('B');

echo 'Text: ', $textarea->getText(), PHP_EOL;
?>

La salida es la siguiente:

11:58:04 : C
11:58:05 : L
11:58:07 : U
11:58:08 : B
Text: CLUB

Si tiene alguna pregunta sobre éste artículo por favor deje un comentario y será respondido.

Descargas

No existen descargas asociadas

Comentarios

Sus comentarios son importantes.

Listado de comentarios

No hay comentarios para listar, si desea puede crear el primer comentario para este artículo.

Agregar un comentario

Debe estar identificado para agregar un comentario