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.