Bonjour
Je voudrais savoir si le décorateur, telle qu'il est défini ici:
http://come-david.developpez.com/tut...=Decorateur#LV
correspond au visitor, défini ici:
http://en.wikipedia.org/wiki/Visitor_pattern
merci
Version imprimable
Bonjour
Je voudrais savoir si le décorateur, telle qu'il est défini ici:
http://come-david.developpez.com/tut...=Decorateur#LV
correspond au visitor, défini ici:
http://en.wikipedia.org/wiki/Visitor_pattern
merci
Euh, nan qu'est ce qui te fait penser à ca ?
D'ailleurs, cet article est en cours de ré-écriture profonde, il est à prendre avec précaution.
le fait qu'il est écrit:
Un décorateur, c'est pour moi un pattern pour lequel on va définir des algorithmes qui vont s'appliquer à plusieurs objets, mais de types différents.Citation:
In object-oriented programming and software engineering, the visitor design pattern is a way of separating an algorithm from an object structure it operates on.
C'est ce qu'il me semblait comprendre en lisant le wikipedia.
Sinon, qu'est-ce qu'un visiteur?
Salut,
Les deux patterns ont des objectifs différents.
Le visiteur permet de parcourir une série d'éléments et d'invoquer, pour chacun, des comportements déterminés.
Le décorateur permet quant à lui de rajouter des comportements à un objet ;)
j'ai essayé de codé moi-même un pattern visiteur:
Code:
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 class Visiteur; class Visite{ private: int o; public: Visite(int u):o(u){} void fixe(int x){ o=x; } void accepte(Visiteur* visiteur){ visiteur->visite(this); } }; class Visiteur{ private: int j; public: Visiteur(int u):j(u){} void visite(Visite *visite){ visite->fixe(j); } }; int main(){ Visiteur visteur(4); Visite visite(3); visite.accepte(&visteur); }
Je ne sais pas si cela peut-être considéré comme un pattern visiteur, mais je ne comprends pas pourquoi le compilateur me renvoie comme erreur:
error C2027: use of undefined type 'Visiteur'
alors que j'ai bien utilisé une déclaration anticipée de la classe visiteur.
merci
Quand tu fais:
T'as besoin de connaitre le type. La déclaration anticipée marche pas.Code:
1
2 visiteur->visite(this);
En fait, j'ai résolu le problème comme cela:
Je ne sais pas si c'est la meilleure solution, mais cela fonctionneCode:
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 class Visite; class IVisiteur{ public: virtual void visite(Visite *v)=0; }; class Visite{ private: int o; public: Visite(int u):o(u){} void fixe(int x){ o=x; } void accepte(IVisiteur* visiteur){ visiteur->visite(this); } }; class Visiteur:public IVisiteur{ private: int j; public: Visiteur(int u):j(u){} void visite(Visite *visite){ visite->fixe(j); } };
c'est parce que tu dois attendre que la classe visiteur soit définie avant de définir la fonction accepte (vu que tu tente d'accéder à une fonction membre de visiteur :aie:)
De plus, le pattern visiteur est particulièrement intéressant quand tu te trouve face à une hiérarchie polymorphe, afin de t'assurer que le comportement adapté est bel et bien invoqué.
Il n'a que peu d'intérêt si c'est pour invoquer des comportements non polymorphes (car on estime que la fonction que l'on voudra appeler fait partie... de l'interface publique de l'objet :D)
+1.
D'où ma réponse dans une de tes nombreuses autres questions.
Tu cherches à comprendre comment c'est fait, avant que de comprendre pourquoi on l'utilise. Tu marches à l'envers ! 8O
Personnellement, j'ai découvert le pattern Visiteur dans cette discussion pour résoudre un problème très précis : hiérarchie polymorphe et accès à des fonctions membres qui sont pas dans la classe de base.
Du coup, tant que t'auras pas réellement rencontré une vraie situation en code où t'en as besoin, j'ai bien peur que tu ne l'intègres pas vraiment ce pattern...
Désolé d'en remettre une couche, mais promis c'est la dernière.
deubelte, ça fait presque 4 ans ( 8O )qu'on te voie sur DVP à poser des questions sur le C++ , et t'as toujours pas essayé un seul projet perso, si petit soit-il. Moi je dis, faut pas chercher plus loin l'origine des problèmes. Je plussoie Koala sur la nécessité de l'apprentissage théorique, mais là, y'a comme un vide...
En plus, je suis pas le premier à remarquer que tu mets la charrue avant les bœufs sans vraiment chercher à comprendre
C'est un exemple parmi n, suffit de se baisser pour en ramasser... :?