Aller au contenu principal

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

observer

  • 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)

Diagramme UML

observer