Observer pattern orienté développement événementiel déclaratif

Description

L'Observer / Observable pattern est super pratique car il vous permet de faire du code évènementiel. Contrairement à la majorité des implémentations, j'ai utilisé quelques tricks afin de simplifier le côté déclaratif côté gestion d'événements.

Exemple de déclaration :

class car extends ObservableBase {
const evtAccelerate = 1; // declare event
public function speedUp() {
$this->raise(self::evtAccelerate);
}
}

Exemple d'attachement

$car = new car();
$car->onAccelerate('myFunction');
function myFunction(&$sender, &$args) { ...

Un exemple plus complet :

Source / Exemple :


<?php

	/**

  • Observer Design Pattern
  • @author I. CHIRIAC
  • @package Events
  • /
require_once('events.lib.php'); class MyEventArg extends EventArgs { public $counter = 0; } /**
  • Defines a basic observable object
  • /
class observable extends ObservableBase { /**
  • Defines event const
  • Important : events names definition must start with evt
  • /
const evtDoSomeThing = 1; // define a simple instance variable public $name; // constructor public function __construct($name) { $this->name = $name; } /**
  • Defines an object action who will raise an event
  • /
public function doSomeThing() { // Raising event by passing constant definition $this->raiseEvent(self::evtDoSomeThing, new MyEventArg()); } } /**
  • Defines a basic observer
  • /
class observer { public function __construct(observable $observable) { $observable->onDoSomeThing( array( $this, 'HandleSomeThing' ) ); } public function HandleSomeThing(observable &$sender, MyEventArg &$args) { $args->counter ++; echo 'Observer can catch that '.$sender->name.' was doing something / '.$args->counter.' <br />'; } } /**
  • DEFINES A STATIC EVENT : FOR ALL INSTANCES
  • /
// FOR PHP 5.x to 5.3 observable::attach(observable::evtDoSomeThing, 'HandleDoSomeThing'); // FOR PHP 5.3 and SUP // observable::onDoSomeThing('HandleDoSomeThing'); // DO ACTIONS $toto = new observable('toto'); /**
  • Defines a specific instance event for toto
  • /
$toto->onDoSomeThing('TotoDoSomeThing'); /**
  • Creating an object
  • /
$observer = new observer($toto); // CALLING $toto->doSomeThing(); /**
  • Create another instance
  • /
$titi = new observable('titi'); $titi->doSomeThing(); /**
  • DEFINE EVENTS
  • /
function HandleDoSomeThing(observable &$sender, MyEventArg &$args) { $args->counter ++; echo $sender->name.' was doing some thing / '.$args->counter.'...<br />'; } function TotoDoSomeThing(observable &$sender, MyEventArg &$args) { $args->counter ++; echo'Go on toto / '.$args->counter.' !<br />'; $args->stopBubble(); } ?>

Conclusion :


Fonctionnalités :

- Attachement d'un callback
  • par instance
  • par class


- Gestion de l'événement
  • Avoir la référence de l'appellant
  • Avoir la référence de l'argument
  • Pouvoir stopper la propagation


- Gestion de la déclaration
  • On déclare les événements avec une constante
  • On vérifie si l'événement existe et est déclaré

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.