Observateur (patron de conception)

Un article de Wikipédia, l'encyclopédie libre.

Le patron de conception observateur/observable est utilisé en programmation pour envoyer un signal à des modules qui jouent le rôle d'observateur. En cas de notification, les observateurs effectuent alors l'action adéquate en fonction des informations qui parviennent depuis les modules qu'ils observent (les "observables").

[modifier] Utilité

La notion d'observateur/observable permet de coupler des modules de façon à réduire les dépendances aux seuls phénomènes observés.

[modifier] Illustration

Prenons comme exemple une classe qui produit des signaux (données observables), visualisée à travers des panneaux (observateurs) d'une interface graphique. On souhaite que la mise à jour d'un signal modifie le panneau qui l'affiche. Afin d'éviter l'utilisation de thread ou encore d'inclure la notion de panneau dans les signaux il suffit d'utiliser le patron de conception observateur/observable.

Le principe est que chaque classe observable contient une liste d'observateurs, ainsi à l'aide d'une méthode de notification l'ensemble des observateurs est prévenu. La classe observée hérite de "Observable" qui gère la liste des observateurs. La classe Observateur est quant à elle purement abstraite, la fonction de mise à jour ne pouvant être défini que par une classe spécialisée.

[modifier] Un exemple en langage Java

L'exemple ci-dessous montre comment utiliser l'API du langage Java qui propose des interfaces et des objets abstraits liées à ce patron de conception.

  • On crée une classe qui étend java.util.Observable et dont la méthode de mise à jour des données setData lance une notification des observateurs (1) :
class Signal extends Observable {
 
  void setData(byte[] lbData){
    notifyObservers(); // (1) notification
  }
}
  • On crée le panneau d'affichage qui implante l'interface java.util.Observer. Avec une méthode d'initialisation (2), on lui transmet le signal à observer (2). Lorsque le signal notifie une mise à jour, le panneau est redessiné (3).
class JPanelSignal extends JPanel implements Observer {
 
  void init(Signal lSigAObserver) {
    lSigAObserver.addObserver(this); // (2) ajout d'observeur
  }
 
  void update(Observable observable, Object objectConcerne) {
    repaint();  // (3) traitement de l'observation
  }
}