Inicio > PHP > Observer

OBSERVER

24/11/2017PHP

 

El patrón observer, también conocido como el patrón publicación-inscripción, el cual, permite definir una dependencia uno-a-muchos entre varios objetos, provocando que cuando uno cambie de estado sus objetos dependientes sean avisados. Para así reducir el acoplamiento entre clases que requieren mantener una gran consistencia en sus relaciones. Se denomina Sujeto al objeto que emite la información sobre el cambio de estado, y Observador al que la recibe para realizar la acción que sea necesaria.
En la versión 5.1 de php, existen las interfaces SplSubject y SplObserver para implementar respectivamente el sujeto y el observador.
Para entenderlo voy a ponerlo en un ejemplo de la vida real que he visto en una web:
- Un padre ve como su niño anda en bicicleta, él esta ateto el 100% del tiempo mirando que no se golpee, sí un accidente ocurriese el padre se enteraría al instante ya que ve lo que sucedió. Aquí vemos como el observador está monitoreando constantemente al observado.
- Un niño esta andando en bicicleta y al tener un incidente éste avisa a su padre. Aquí vemos como el observado notifica a su observador en determinado evento.
En el siguiente ejemplo se ve el código de este patrón:

//Clase observada
class Articulo implements \SplSubject
{
protected $storage;

public function __construct(\SplObjectStorage $storage)
{
$this->storage = $storage;
}

public function compra()
{
// compra
$this->notify('comprado');
}

public function vende()
{
// vende
$this->notify('vendido');
}

public function attach(\SplObserver $observer)
{
$this->storage->attach($observer);
}

public function detach(\SplObserver $observer)
{
$this->storage->detach($observer);
}
public function notify($event = '')
{
foreach ($this->storage as $observer)
$observer->update($this, $event); }
}

//Clase observadora
class Notify implements \SplObserver /*seguimos con lai implementacion del observer*/
{
public function update(\SplSubject $subject, $event = '')
{
if ($event == 'comprado')
echo 'El artículo se ha comprado
';
else if ($event == 'vendido')
echo 'El artículo se ha vendido
';
}
}

class Notify2 implements \SplObserver /*seguimos con lai implementacion del observer*/ { // Segunda clase Clase observadora
public function update(\SplSubject $subject, $event = '')
{
if ($event == 'comprado')
echo 'El artículo se ha comprado aaaa
';
else if ($event == 'vendido')
echo 'El artículo se ha vendido aaa
';
}
}

/*¿Cómo luciría llevado a la práctica?*/

/*Creamos el objeto*/
$articulo = new Articulo(new \SplObjectStorage());
//Se añade observer $articulo->attach(new Notify());
//Se guarda este objeto ya que se va a borrar este observador
$not2 = new Notify2();
$articulo->attach($not2);
/*imprimiría en pantalla que se ha comprado*/
$articulo->compra();
//Se borra observador
$articulo->detach($not2);
/*imprimiría que se ha vendido*/
$articulo->vende();

Este patrón se suele usar para escribir en logs, para actualizar gráficas automáticamente, etc...