Le motif observer

Définition

Ce motif permet de garder vos objets au courant de l’etat d’un autre.

Principe

C’est le principe des mailling list puisque les objets viennent s’annoncer comme interessé pour recevoir des nouvelles d’un autre, et eventuellement plus tard dire que ça ne les interessent plus. Entre temps ils reçoivent des nouvelles en fonction de l’état de l’objet “observé”. En fait nous sommes les observeurs d’une mailling list sont état est change à chaque réception de courrier. Vous voyez, finalement vous connaissez déjà le principe de celui la, il nous entoure partout. On peut aussi faire un parallèle avec les abonnements à des magazines par exemple.

L’exemple par le code

Nous allons observer comment tenir au courant les fans de la rubyfanfare ;-).

Le système d’information central

Tout d’abord nous avons un système centrale pour communiquer notre actualité. Pour mettre en place ce motif Ruby nous aide en nous fournissant un objet Observable. Cet objet vas nous permettre de définir notre serveur comme observable.

 require 'observer'
 class ServeurActu
    include Observable
    def publierUneInfo(info)
        changed
        print "---- Publication d'une info sur le serveur\n" 
        notify_observers(info)
    end
    def ajouterAbonnement(abonne)
        add_observer(abonne)
    end
    def enleverAbonnement(abonne)
        delete_observer(abonne)
    end
 end

Les abonnements

Ensuite nous avons deux type d’abonnements à nos nouvelles. Un par courrier standard, une sorte de programme, et un par mail car nous sommes moderne et à la pointe de la technologie.

 require 'ServeurActu'
 module TypeAbonnement
    def update(info)
       print "rien du tout ... \n" 
    end
    def initialize(nom, serveur)
       @nom = nom
       @serveur = serveur
       @serveur.ajouterAbonnement(self)
    end
    def annulerAbonnement
       @serveur.enleverAbonnement(self)
    end 
 end
 class AbonnementParMail
    include TypeAbonnement
    def update(info)
       print "Envoyer par mail à " + @nom + ": " + info  + "\n" 
    end
 end
 class AbonnementParCourrier
    include TypeAbonnement
    def update(info)
       print "Envoyer par courrier à " + @n om + ": " + info + "\n" 
    end
 end

Le guichet

Voilà c’est là que les dinosaure nous rattrappe, nous avons juste un petit guichet pret d’un théatre pour inscrire nos abonnées. Il pourrais vous inscrire pour des informations par mail ou par courrier (comme défini au dessus) et s’arrangeras pour vérifier que tout ce passe bien.

 require "ServeurActu" 
 require "TypeAbonnement" 

 serveur = ServeurActu.new

 abonne1 = AbonnementParMail.new("Jean", serveur)
 abonne2 = AbonnementParCourrier.new("Eric", serveur)

 serveur.publierUneInfo("Nouvelle date de concert le 31/12/2005 !! à ne pas manquer")

 abonne2.annulerAbonnement
 abonne3 = AbonnementParCourrier.new("Georges", serveur)
 abonne2 = AbonnementParMail.new("Eric", serveur)

 serveur.publierUneInfo("sorti du disque prévu en mars 2006...")

Pour finir voici un exemple simplifié de l’observer

Ruby Design Patterns – Observer