Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Du 22 au 24 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Design Patterns en C#
  3. Le pattern Observer
Extrait - Design Patterns en C# Les 23 modèles de conception : descriptions et solutions illustrées en UML 2 et C# [3e édition]
Extraits du livre
Design Patterns en C# Les 23 modèles de conception : descriptions et solutions illustrées en UML 2 et C# [3e édition]
1 avis
Revenir à la page d'achat du livre

Le pattern Observer

Description

Le pattern Observer a pour objectif de construire une dépendance entre un sujet et des observateurs de sorte que chaque modification du sujet soit notifiée aux 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 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 4-8.1.

images/figure24-1.png

Figure 4-8.1 - Le pattern Observer appliqué à l’affichage de véhicules

Le diagramme contient les quatre classes suivantes :

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

  • Véhicule 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.

  • VueVéhicule est la sous-classe concrète d’implantation de Observateur dont les instances affichent les informations...

Structure

1. Diagramme de classes

La figure 4-8.3 détaille la structure générique du pattern.

images/figure24-3.png

Figure 4-8.3 - Structure du pattern Observer

2. Participants

Les participants au pattern sont les suivants :

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

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

  • SujetConcret (Véhicule) est une classe d’implantation d’un sujet. Un sujet envoie une notification quand son état est modifié.

  • ObservateurConcret (VueVéhicule) est une classe d’implantation d’un observateur. Celui-ci maintient une référence vers son sujet et implante 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 getÉtat.

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 pattern 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 C#

Nous reprenons l’exemple de la figure 4-8.1. Le code source de la classe Sujet est donné à la suite. Les observateurs sont gérés à l’aide d’une liste.

using System.Collections.Generic; 
 
public abstract class Sujet 
{ 
 protected IList<Observateur> observateurs =  
     new List<Observateur>(); 
 
 public void ajoute(Observateur observateur) 
 { 
   observateurs.Add(observateur); 
 } 
 
 public void retire(Observateur observateur) 
 { 
   observateurs.Remove(observateur); 
 } 
 
 public void notifie() 
 { 
   foreach (Observateur observateur in observateurs) 
     observateur.actualise(); 
 } 
} 

Le code source de l’interface Observateur est très simple car il ne contient que la signature de la méthode actualise.

public interface Observateur 
{ 
 void actualise(); 
} 

Le code source de la classe Vehicule se trouve à la suite. Elle contient deux attributs et les accesseurs en lecture et écriture pour ces deux attributs. Les deux accesseurs en écriture invoquent la méthode notifie.

using System; 
 
public class Vehicule : Sujet 
{ 
 protected...