Observer (ou Observateur en français)
Le design pattern Observer (ou Observateur en français) est un patron de conception comportemental. Il permet à un objet (le sujet) de notifier automatiquement une liste d'autres objets (les observateurs) lorsqu’un changement d’état se produit.
🧩 À quoi ça sert ?
- À mettre en place une relation 1 → N : quand un objet change, tous les observateurs en sont informés.
- À découpler le sujet des observateurs.
- Très utilisé pour les interfaces graphiques (UI), les systèmes d'événements, ou même le binding de données.
🧠 Principe

- Sujet (Subject) : connaît les observateurs et les notifie en cas de changement.
- Observateur (Observer) : interface pour les objets qui doivent réagir aux changements.
- Les observateurs s’abonnent au sujet.
- Le sujet n’a pas besoin de savoir qui sont les observateurs ni ce qu’ils font.
Implémentation
Interface pour le sujet observé (subject)
class Subject(ABC):
@abstractmethod
def attach(self, observer: Observer):
pass
@abstractmethod
def detach(self, observer: Observer):
pass
@abstractmethod
def notify(self):
pass
Interface pour les observateurs
class Observer(ABC):
@abstractmethod
def update(self, data):
pass
Implémentation concrète
class WeatherStation(Subject):
def __init__(self):
self._observers = []
self._temperature = 0
def attach(self, observer: Observer):
self._observers.append(observer)
def detach(self, observer: Observer):
self._observers.remove(observer)
def notify(self):
for observer in self._observers:
observer.update(self._temperature)
def set_temperature(self, temp):
print(f"\n[Météo] Nouvelle température : {temp}°C")
self._temperature = temp
self.notify()
Observateurs concrets
class PhoneDisplay(Observer):
def update(self, data):
print(f"📱 Affichage téléphone : {data}°C")
class WindowDisplay(Observer):
def update(self, data):
print(f"🪟 Affichage vitrine : {data}°C")
Utilisation
station = WeatherStation()
phone = PhoneDisplay()
window = WindowDisplay()
station.attach(phone)
station.attach(window)
station.set_temperature(22)
station.set_temperature(18)