Observer

Catégorie

Pattern comportemental

Problème

Définir une dépendance un-à-plusieurs entre des objets afin que lorsqu’un objet (le sujet) change d’état, tous ses dépendants (observateurs) soient notifiés et mis à jour automatiquement.

Solution

  • Le Subject maintient une liste d’Observers et fournit des méthodes pour les attacher/détacher
  • Lorsque l’état du Subject change, il notifie tous les Observers attachés
  • Les Observers implémentent une interface update pour recevoir les notifications

Structure

  • Subject : Maintient une liste d’observateurs ; les notifie des changements d’état
  • Observer : Définit une interface update pour les objets qui doivent être notifiés
  • ConcreteSubject : Stocke l’état ; envoie des notifications lorsque l’état change
  • ConcreteObserver : Implémente l’interface update ; maintient une référence au sujet

Avantages clés

  • Couplage lâche — Le Subject et les Observers sont découplés ; le Subject ne connaît pas les types concrets des observateurs
  • Communication en diffusion — Un changement peut notifier de nombreux observateurs
  • Relations dynamiques — Les Observers peuvent être ajoutés/retirés à l’exécution

Compromis

  • Ordre des notifications — Aucun ordre garanti pour les notifications aux observateurs
  • Mises à jour inattendues — Les Observers peuvent être notifiés de changements qui ne les concernent pas

Quand l’utiliser

  • Un changement sur un objet nécessite de changer d’autres objets, et vous ne savez pas combien d’objets doivent être modifiés
  • Un objet doit pouvoir notifier d’autres objets sans faire d’hypothèses sur leur identité
  • Vous avez besoin d’un mécanisme de publication-abonnement

Exemples