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