mercredi 14 mars 2012
Le hockey vu par un programmeur : Design pattern Observer
Publié par Infinite Loop, à 19 h 50
0 commentaire
Pendant un bref instant, j'ai imaginé comment le patron de conception Observer pourrait être implémenté dans un contexte de hockey. En une phrase simple, le principe est qu'il y a des observateurs qui veulent être informés lorsqu'un événement se produit. Je vous laisse juger de la pertinence de mon exemple en PHP.
Avant d'aller plus loin...
- Ce n'est qu'une structure très minimaliste. Les exemples de la vraie vie sont plus complexes.
- J'aurais pu le réaliser à l'aide des interfaces SPL SplObserver et SplSubject.
- Oui, c'est complètement inutile mais ça illustre bien l'idée.
class HockeyPlayer{ public $name = ''; protected $_observers = array(); public function __construct($name){ $this->name = $name; } public function attachObserver($type, $observer){ $this->_observers[$type][] = $observer; } public function notifyObserver($type){ if(isset($this->_observers[$type])){ foreach($this->_observers[$type] as $observer){ $observer->update($this, $type); } } } public function score(){ try{ // essayer souvent... throw new Exception('La rondelle a déviée sur lui.'); } catch(Exception $e){ $this->notifyObserver('score'); } } }Et des observateurs attentifs qui attendent l'événement pour réagir.
class FanPage{ public function update(HockeyPlayer $player, $action){ Boxscore::log($player->name, $action, 'Mettre à jour didgomezscore.com : YES!'); } } class Fans{ public function update(HockeyPlayer $player, $action){ Boxscore::log($player->name, $action, 'Changer son statut Twitter tellement la nouvelle est incroyable et doit être partagée.'); } } class SportWriters{ public function update(HockeyPlayer $player, $action){ Boxscore::log($player->name, $action, "Rédiger rapidement un article qui prouve que $player->name est un héros obscur et que ça sent la coupe Stanley."); } }Dans les faits, lorsque le miracle se produit, une réaction en chaîne est déclenchée.
$scott = new HockeyPlayer('Scott Gomez'); $website = new FanPage(); $fans = new Fans(); $medias = new SportWriters(); $scott->attachObserver('score', $website); $scott->attachObserver('score', $fans); $scott->attachObserver('score', $medias); $scott->score();Maintenant, libre à vous d'adapter le code pour inclure le mal-aimé de votre équipe préférée.