void MonVisiteur::visitObjetDeType3( ObjetDeType3 * objet )
 // Traitement d'un objet de type 3
Java.
L'exemple suivant montre comment afficher un arbre de nœuds (les composants d'une voiture).
Au lieu de créer des méthodes d'affichage pour chaque sous-classe (Wheel, Engine, Body, et Car), une seule classe est créée (CarElementPrintVisitor) pour afficher les éléments.
Parce que les différentes sous-classes requièrent différentes actions pour s'afficher proprement, la classe CarElementPrintVisitor répartit l'action en fonction de la classe de l'argument qu'on lui passe.
interface CarElementVisitor
 void visit(Wheel wheel);
 void visit(Engine engine);
 void visit(Body body);
 void visitCar(Car car);
interface CarElement
 void accept(CarElementVisitor visitor);
 // Méthode à définir par les classes implémentant CarElements
class Wheel implements CarElement
 private String name;
 Wheel(String name)
 this.name = name;
 String getName()
 return this.name;
 public void accept(CarElementVisitor visitor)
 visitor.visit(this);
class Engine implements CarElement
 public void accept(CarElementVisitor visitor)
 visitor.visit(this);
class Body implements CarElement
 public void accept(CarElementVisitor visitor)
 visitor.visit(this);
class Car
 CarElement[] elements;
 public CarElement[] getElements()
 return elements.clone(); // Retourne une copie du tableau de références.
 public Car()
 this.elements = new CarElement[]
 new Wheel("front left"),
 new Wheel("front right"),
 new Wheel("back left"),
 new Wheel("back right"),
 new Body(),
 new Engine()
class CarElementPrintVisitor implements CarElementVisitor
 public void visit(Wheel wheel)
 System.out.println("Visiting "+ wheel.getName() + " wheel");
 public void visit(Engine engine)
 System.out.println("Visiting engine");
 public void visit(Body body)
 System.out.println("Visiting body");
 public void visitCar(Car car)
 System.out.println("\nVisiting car");
 for(CarElement element : car.getElements())
 element.accept(this);
 System.out.println("Visited car");
class CarElementDoVisitor implements CarElementVisitor
 public void visit(Wheel wheel)
 System.out.println("Kicking my "+ wheel.getName());
 public void visit(Engine engine)
 System.out.println("Starting my engine");
 public void visit(Body body)
 System.out.println("Moving my body");
 public void visitCar(Car car)
 System.out.println("\nStarting my car");
 for(CarElement carElement : car.getElements())
 carElement.accept(this);
 System.out.println("Started car");
public class VisitorDemo
 static public void main(String[] args)
 Car car = new Car();
 CarElementVisitor printVisitor = new CarElementPrintVisitor();
 CarElementVisitor doVisitor = new CarElementDoVisitor();
 printVisitor.visitCar(car);
 doVisitor.visitCar(car);
PHP.
<?php
interface CarElement
 public function accept(CarElementVisitor $visitor);
interface CarElementVisitor
 public function visit(CarElement $carElement);
class Body implements CarElement
 public function accept(CarElementVisitor $visitor)
 $visitor->visit($this);
class Engine implements CarElement
 public function accept(CarElementVisitor $visitor)
 $visitor->visit($this);
class Wheel implements CarElement
 private $name;
 public function __construct(String $name)
 $this->name = $name;
 public function getName()
 return $this->name;
 public function accept(CarElementVisitor $visitor)
 $visitor->visit($this);
class Car
 private $elements;
 public function __construct()
 $this->elements = [
 new Wheel("front left"),
 new Wheel("front right"),
 new Wheel("back left"),
 new Wheel("back right"),
 new Body(),
 new Engine()
 public function getElements()
 return $this->elements; // Retourne une copie du tableau de références.
class CarElementDoVisitor implements CarElementVisitor
 public function visit(CarElement $carElement)
 if ($carElement instanceof Wheel) {
 echo "Kicking my " . $carElement->getName() . "<br>";
 if ($carElement instanceof Engine) {
 echo "Starting my engine<br>";
 if ($carElement instanceof Body) {
 echo "Moving my body<br>";
 public function visitCar(Car $car)
 echo "<br>Starting my car<br>";
 foreach ( $car->getElements() as $carElement ) {
 $carElement->accept($this);
 echo "Started car<br>";
class CarElementPrintVisitor implements CarElementVisitor
 public function visit(CarElement $carElement)
 if ($carElement instanceof Wheel) {
 echo "Visiting " . $carElement->getName() . "wheel<br>";
 if ($carElement instanceof Engine) {
 echo "Visiting engine<br>";
 if ($carElement instanceof Body) {
 echo "Visiting body<br>";
 public function visitCar(Car $car)
 echo "Visiting car<br>";
 $elements = $car->getElements();
 foreach ( $elements as $element) {
 $element->accept($this);
 echo "Visited car<br>";
$car = new Car();
$printVisitor = new CarElementPrintVisitor();
$doVisitor = new CarElementDoVisitor();
$printVisitor->visitCar($car);
$doVisitor->visitCar($car);

Patrons de conception/Patrons GRASP
GRASP signifie "General Responsibility Assignment Software Patterns/Principles".
Ces patrons de conception donnent des conseils généraux sur l'assignation de responsabilité aux classes et objets dans une application.
Ils sont issus du bon sens de conception, intuitifs et s'appliquent de manière plus générale.
Une responsabilité est vue au sens conception (exemples : création, détention de l'information, ...) :
En UML, l'assignation de responsabilité peut être appliquée à la conception des diagrammes de collaboration.
Les patrons de conception GRASP sont les suivants :

Patrons de conception/Expert en information

Le principe de l'expert en information est d'assigner la responsabilité d'une requête à la classe qui détient les informations nécessaires.
Il s'agit de créer la méthode là où les données se trouvent.
Il s'agit d'appliquer le principe « Celui qui sait le fait » ou de mettre les services avec les attributs.
Exemples.
Bibliothèque.
Dans un logiciel de gestion de bibliothèque, nous avons créé les classes codice_1 et codice_2.
Nous voulons ajouter une méthode retournant le livre en fonction de son numéro.
À quelle classe assigner cette responsabilité ?
La classe susceptible de détenir les informations nécessaires est la classe codice_2.
On lui ajoute donc cette méthode de recherche de livre.
Facturation.
Dans un logiciel de gestion de vente, nous avons les classes et attributs suivants :
À quelle(s) classe(s) assigner la responsabilité de calculer le total de la facture ?
La classe codice_6 connaît l'article utilisé et la quantité commandée.
On lui ajoute une méthode codice_13 qui demandera le prix unitaire à l'codice_8 et le multipliera par la quantité.
La classe codice_4 connaît la liste de tous les produits facturés.
On lui ajoute une méthode codice_16 qui effectue la somme des sous-totaux demandés aux différentes instances de la classe codice_6 en appelant la méthode codice_13.
Cet exemple illustre comment une responsabilité peut être répartie sur plusieurs classes.
Chaque classe est responsable de la partie qui la concerne.
Cet exemple démontre également que ce patron de conception favorise l'encapsulation : Une classe n'a pas besoin de connaître la structure interne de la classe codice_4 pour calculer le montant total dû.