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()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é !
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)
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 ! ;-)
Partager