Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en PHP
  3. Le design pattern Observer
Extrait - Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
Extraits du livre
Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
1 avis
Revenir à la page d'achat du livre

Le design pattern Observer

Description

Le design pattern Observer a pour objectif de modéliser une dépendance entre un sujet et des observateurs de sorte que chaque modification de l’état interne du sujet soit notifiée à ses observateurs afin qu’ils puissent mettre à jour leur état.

Exemple

Nous voulons mettre à jour l’affichage d’un catalogue de véhicules en temps réel. Chaque fois que les informations relatives à un véhicule sont modifiées, nous voulons mettre à jour l’affichage de celles-ci. Il peut y avoir plusieurs affichages simultanés.

La solution préconisée par le design pattern Observer consiste à établir un lien entre chaque véhicule et ses vues pour que le véhicule puisse leur indiquer de se mettre à jour quand son état interne a été modifié. Cette solution est illustrée à la figure 24.1.

images/24EI01.png

Figure 24.1 - Le design pattern Observer appliqué à l’affichage de véhicules

Le diagramme contient les quatre classes ou interfaces suivantes :

  • Sujet est la classe abstraite qui introduit tout objet notifiant d’autres objets des modifications de son état interne.

  • Vehicule est la sous-classe concrète de Sujet qui décrit les véhicules. Elle gère deux attributs : description et prix.

  • Observateur est l’interface de tout objet qui a besoin de recevoir des notifications de changement d’état provenant des objets auprès desquels il s’est préalablement inscrit.

  • VueVehicule est la sous-classe concrète d’implémentation de Observateur dont les instances affichent...

Structure

1. Diagramme de classes

La figure 24.3 détaille la structure générique du design pattern Observer.

images/24EI03.png

Figure 24.3 - Structure du design pattern Observer

2. Participants

Les participants au design pattern Observer sont les suivants :

  • Sujet (AbstractSujet) est la classe abstraite qui abrite l’association avec les observateurs ainsi que les méthodes pour ajouter ou retirer des observateurs. 

  • Observateur (ObservateurInterface) est l’interface à implémenter pour recevoir des notifications (méthode actualise).

  • SujetConcret (Vehicule) est une classe d’implémentation d’un sujet. Un sujet envoie une notification quand son état interne est modifié.

  • ObservateurConcret (VueVehicule) est une classe d’implémentation d’un observateur. Celui-ci maintient une référence vers son sujet et implémente la méthode actualise. Elle demande à son sujet des informations faisant partie de son état lors des mises à jour par invocation de la méthode getEtat.

3. Collaborations

Le sujet concret notifie ses observateurs lorsque son état interne est modifié. Lorsqu’un observateur reçoit cette notification, il se met à jour en conséquence. Pour réaliser cette mise à jour, il peut invoquer des méthodes du sujet donnant accès à son état.

Domaines d’application

Le design pattern Observer est utilisé dans les cas suivants :

  • Une modification dans l’état d’un objet engendre des modifications dans d’autres objets qui sont déterminés dynamiquement.

  • Un objet veut prévenir d’autres objets sans devoir connaître leur type, c’est-à-dire sans être fortement couplé à ceux-ci.

  • On ne veut pas fusionner deux objets en un seul.

Exemple en PHP

Nous reprenons l’exemple de la figure 24.1. Le code source de la classe AbstractSujet est donné à la suite. Les observateurs sont gérés à l’aide d’un tableau.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Observer; 
 
abstract class AbstractSujet 
{ 
   protected array $observateurs = []; 
 
   public function ajoute(ObservateurInterface $observateur): void 
   { 
       $this->observateurs[] = $observateur; 
   } 
 
   public function retire(ObservateurInterface $observateur): void 
   { 
       $key = array_search($observateur, $this->observateurs); 
 
       if (false !== $key) { 
           unset($this->observateurs[$key]); 
       } 
   } 
 
   public function notifie(): void 
   { 
       foreach ($this->observateurs as $observateur) { 
           $observateur->actualise(); 
       } 
   } 
} 

Le code source de l’interface ObservateurInterface est très simple...