AHRIMAN.FR

SCIENCE - NEO-EVHEMERISME - DONJONSDRAGONS

Design pattern : Visiteur

Ecris par :
Mis en ligne le :
Lu :
99 fois
Twitter Facebook Google Plus Linkedin email

En programmation orientée objet et en génie logiciel, le patron de conception comportemental visiteur est une manière de séparer un algorithme d'une structure de données.

PRINCIPE

Ce modèle de conception permet à une classe externe d'être informée du type exact d'instances d'un ensemble de classes. Cela permet de mettre en place un traitement adapté aux détails publics des objets en cause. Par exemple un visiteur est idéal pour réaliser un rapport.

Déporter des opérations contenues dans une classe vers une autre peut sembler mauvais au sens de la POO car l'ajout ou la modification d'une classe n’entraîne pas l'adaptation des visiteurs existants, ce modèle est utile lorsqu'on a un ensemble de classes fermées (par exemple fourni par un tiers) et que l'on veut effectuer un nouveau traitement sur ces classes.

En pratique, le modèle de conception visiteur est réalisé de la façon suivante : chaque classe pouvant être « visitée » doit mettre à disposition une méthode publique « accepter » prenant comme argument un objet du type « visiteur ». La méthode « accepter » appellera la méthode « visite » de l'objet du type « visiteur » avec pour argument l'objet visité. De cette manière, un objet visiteur pourra connaître la référence de l'objet visité et appeler ses méthodes publiques pour obtenir les données nécessaires au traitement à effectuer (calcul, génération de rapport, etc.).

En pratique un visiteur permet d'obtenir le même effet que d'ajouter une nouvelle méthode virtuelle à un ensemble de classe qui ne le permet pas.

EN C++

Prenons une classe ObjetPere, de laquelle hériteront Objet1, Objet2 et Objet3, elles posséderont la méthode accept(Visitor v).



void ObjetDeType1::accept( MonVisiteur * v ) {
v->visitObjetDeType1( this ) ;
}

Créons la classe MonVisiteur, dont hériteront Visiteur1 et Visiteur2. Dans chacun de ces objets, on retrouvera une méthode visiterObjet1(Objet1 a), visiterObjet2(Objet2 b) et visiterObjet3(Objet3 c).



void MonVisiteur::visitObjetDeType1( ObjetDeType1 * objet ) {
// Traitement d'un objet de type 1
}

void MonVisiteur::visitObjetDeType2( ObjetDeType2 * objet ) {
// Traitement d'un objet de type 2
}

void MonVisiteur::visitObjetDeType3( ObjetDeType3 * objet ) {
// Traitement d'un objet de type 3
}

Images

Bibliographie