Pattern observateur

ben
Eléphanteau du PHP | 10 Messages

05 juil. 2007, 00:00

Salut à tous,

si ça intéresse quelqu'un voici un petit sample de pattern observateur, avec le "traditionnel" thème d'une station météo ayant des vues différentes.
Je pense que le mieux reste de tester, en espérant que ça puisse servir à qqn.
Je précise que dans le cas de la version ci-dessous, c'est bien entendu uniquement compatible php5.
<?php
/** 
 * Interface: IObservateur
 *  Implementee par les observateurs
 */  
interface IObservateur {
	public function recoitNotification($oEmetteur, $oArguments);
}
/**
 * Interface: IObserve
 *  Implementee par "l'observé"
 */ 
interface IObserve {
	public function ajouteObservateur(IObservateur $observer);
}
/**
 * Class: Meteo
 *  La classe qui notifie
 */  
class Meteo implements IObserve {
	/**
	 * ==========================================================================
	 *  GROUP: Proprietes privees
	 * ==========================================================================	
	 * 	  	 	
	 * Var: $_aObservateurs
	 *  Liste des observateurs de meteo
	 */ 
	private $_aObservateurs = Array();
	/**
	 * ==========================================================================
	 *  GROUP: Mehodes publiques
	 * ==========================================================================	
	 *
	 * Method: ajouteObservateur
	 *  
	 * Parameters:
	 *  IObservateur $oObservateur	 	 
	 */ 
	public function ajouteObservateur(IObservateur $oObservateur) {
		$this->_aObservateurs[] = $oObservateur;
	}
	/**
	 * Method: changeTemperature
	 *  Appele quand la temperature augmente ou baisse
	 *  
	 * Parameters:
	 *  float $nTemperature, la temperature en °	 	 	 
	 */ 
	public function changeTemperature($nTemperature) {
		foreach ($this->_aObservateurs as $oObservateurs) {
			$oObservateurs->recoitNotification(
				$this, 
				Array('nTemperature' => $nTemperature)
			);
		}
	}
}
/**
 * Class: MeteoDigitale
 *  Une classe qui observe Meteo, avec un affichage digital (en theorie)
 */ 
class MeteoDigitale implements IObservateur {
	public function recoitNotification($oEmetteur, $oArguments) {
		print "[DIGITAL] La nouvelle température est de : ".$oArguments['nTemperature']."°<br />\n";
	}
}
/**
 * Class: MeteoImage
 *  Une classe qui observe Meteo, et affiche une image (en theorie)
 */ 
class MeteoImage implements IObservateur {
	public function recoitNotification($oEmetteur, $oArguments) {
		print "[IMAGE] La nouvelle température est de : ".$oArguments['nTemperature']."°<br />\n";
	}
}
// ==========================================================================
// Utilisation:
// ==========================================================================
$meteo = new Meteo();
$meteo->ajouteObservateur(new MeteoDigitale());
$meteo->ajouteObservateur(new MeteoImage());
$meteo->changeTemperature(15);
// avec une variable en GET par exemple
if (isset($_GET['nTemperature'])) $meteo->changeTemperature($_GET['nTemperature']);
?>

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

05 juil. 2007, 01:54

À tout hasard, connais-tu la classe SplObserver de SPL ? Je pense que ça fait à peu près la même chose que ton système, à la différence près que SplSubject offre une méthode générique pour notifier les observateurs.