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.
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.
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...