Discussion: Observable - Observer

  1. #1
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    janvier 2010
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2010
    Messages : 159
    Points : 182
    Points
    182

    Par défaut Observable - Observer

    Dans le cadre d'un projet conçu dernièrement, je devais avoir plusieurs vues différentes du même modèle de données. En l'occurrence, ce modèle était sous forme d'instance de classe Windev gérant différents calculs.

    Dans ce contexte, le patron de conception qui me semblait le meilleur était le modèle Observable-Observé (http://fr.wikipedia.org/wiki/Observa..._de_conception)).

    Objectif

    Envoyer un signal à toute instance observant la classe héritant d'Observable.

    Mise en oeuvre

    La mise en oeuvre est relativement simple et consiste en deux classes. La première, Observable, contient un tableau de pointeur d'Observers et des méthodes d'ajout / de suppression et de notification.

    Il suffira de faire appel à la notification lorsqu'on voudra que toutes les vues correspondantes se mettent à jour.

    Observer quant à lui se contente de définir la méthode update() qui devra être redéfinie dans chacune de ses sous-classes pour que le polymorphisme fonctionne correctement.

    Enough word, let's code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Observer est une classe
     
    FIN
     
     
    PROCEDURE PRIVÉE Constructeur()
     
     
    PROCEDURE PRIVÉE Destructeur()
     
     
    PROCEDURE VIRTUELLE update()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    Observable est une classe
    PRIVÉ
    	observateurs est un tableau d'Observer dynamique
    FIN
     
     
    PROCEDURE Constructeur()
    PROCEDURE Destructeur()
    // Résumé : Notifie tous les observateurs qu'ils doivent se mettre à jour
    // Syntaxe :
    // notify ()
    //
    // Paramètres :
    //	Aucun
    // Valeur de retour :
    // 	Aucune
    //
    // Exemple :
    // Indiquez ici un exemple d'utilisation.
    //
    PROCEDURE PUBLIQUE notify()
     
    POUR CHAQUE o DE observateurs
    	o.update()
    FIN
     
    // Résumé : Ajoute un observer au tableau
    // Syntaxe :
    //addObserver (<o> est Observer dynamique)
    //
    // Paramètres :
    //	o (Observer dynamique) : <indiquez ici le rôle de o>
    // Valeur de retour :
    // 	Aucune
    //// Exemple :
    // Indiquez ici un exemple d'utilisation.
    //
    PROCEDURE PUBLIQUE addObserver(o est un Observer dynamique)
    TableauAjoute(observateurs,o)
     
    // Résumé : Retire l'observateur à l'indice indiqué
    // Syntaxe :
    //removeObserver (<indice> est entier)
    //
    // Paramètres :
    //	indice (entier) : indice de l'observateur dans le tableau
    // Valeur de retour :
    // 	Aucune
    //// Exemple :
    // Indiquez ici un exemple d'utilisation.
    //
    PROCEDURE PUBLIQUE removeObserver(indice est un entier)
    TableauSupprime(observateurs,indice)
    Il vous suffira alors de faire hériter vos Modèles à Observable et vos vues à Observer, redéfinir la méthode update pour que la vue se mette à jour, et c'est gagné !

    Sous des airs très basiques, ce patron de conception est très puissant et permet une cohésion des données affichées très facilement.

    J'attend vos retours ! ;-)

  2. #2
    Membre émérite

    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 402
    Points : 881
    Points
    881

    Par défaut

    Merci pour ta contribution,
    je m'intéresse aussi pas mal à la POO sous WD avec plus ou moins de bonheur.
    Je garde ton Pattern sous le coude et je l'appliquerai au plus tôt.
    As tu travaillé sur un pattern Singleton en WD?
    Quel avantage avec une variable globale déclarée au niveau du projet?
    Je te tiens au courant de l'application de Observer/Observable

    BJ

  3. #3
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    janvier 2010
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2010
    Messages : 159
    Points : 182
    Points
    182

    Par défaut

    Hello !

    "Indirectement". C'est-à-dire que j'ai créé quelques classes (Générateurs d'objets par exemple) qui sont considérées comme Singleton mais ne sont pas codées spécialement pour. C'est juste à moi (ou mes collègues) de bien faire gaffe à pas lancer de deuxième instance !

    D'ailleurs, c'est une question intéressante. Je me pencherai sur les propriétés statiques

  4. #4
    Membre émérite

    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 402
    Points : 881
    Points
    881

    Par défaut

    Alors voilà je me lance dans ce pattern...
    Imaginons 5 listes combos chargées d'affiner une recherche
    Exemple (presque un cas d'école) :
    Combo_Article= affiche les données de Article
    Combo_Rayon= affiche les données de Rayon
    Combo_Famille= affiche les données de Famille
    Combo_SousFamille= affiche les données de SousFamille
    Combo_Saison= affiche les données de Saison

    Alors on est dans le cas des listes liées...
    J'imagine qu'on peut gérer ça avec ce pattern mais c'est encore un peu flou.

    Nous disons donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    observableCombo est une classe
    	nomCompletChampCombo est une chaîne
    	fichierLie est une chaîne
    	rubAffiche est une chaîne
    	rubMemorise est une chaîne
     	tableLiaisons est un tableau associatif de chaînes
    FIN
    et

    une classe observer...

Discussions similaires

  1. XStream sérialisation : Observer / Observable
    Par fabred dans le forum Persistance
    Réponses: 3
    Dernier message: 09/05/2012, 00h08
  2. Xstream Serialisation : Observer Observable
    Par fabred dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2007, 14h40
  3. [Observateur] Observable/Observer more infos
    Par sozie9372 dans le forum Design Patterns
    Réponses: 2
    Dernier message: 29/05/2006, 12h54
  4. observer / observable
    Par alex6891 dans le forum Java ME
    Réponses: 9
    Dernier message: 03/05/2006, 15h31
  5. [DP] observer-observable
    Par schousso dans le forum Général Java
    Réponses: 4
    Dernier message: 15/05/2004, 00h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo