Visitor Pattern in Python
Add a new operation, such as calculating total area, to a set of classes without editing those classes.
- Elements with accept(visitor)
- Visitors with one method per element type
- Double dispatch
PriceVisitortotal = 15Book().accept()visit_book → 10Movie().accept()visit_movie → 5
The operation lives in the visitor
Visitor est un patron de conception qui sort une opération des classes des objets pour la placer dans un objet séparé, appelé visiteur (visitor). Chaque objet appelle la méthode du visiteur prévue pour son type. Ainsi, pour ajouter une opération comme le calcul des prix ou la génération d'un rapport, il suffit de créer un nouveau visiteur.
Points clés
- Each element calls the visitor method for its own type.
- A new operation means a new visitor class.
- The element classes stay unchanged.
Quand l’utiliser ?
- Résoudre des problèmes récurrents de conception objet avec des structures éprouvées.
- Découpler les responsabilités afin de faciliter l’extension et les tests du code.
- Employer un vocabulaire de conception commun lors des discussions d’architecture en équipe.
Code d’exemple
class Book:
# Visitor: move new operations outside stable element classes.
def accept(self, visitor): return visitor.visit_book(self)
class Movie:
def accept(self, visitor): return visitor.visit_movie(self)
class PriceVisitor:
def visit_book(self, book): return 10
def visit_movie(self, movie): return 5
# Each element dispatches to the matching visitor method.
visitor = PriceVisitor()
print(sum(item.accept(visitor) for item in [Book(), Movie()]))
Résultat de l’exécution
15
Explication du code
Chaque élément a une méthode accept() qui appelle la méthode correspondante du visiteur : Book appelle visit_book() et Movie appelle visit_movie(). PriceVisitor contient toute la logique de prix, les classes Book et Movie n'ont donc rien à savoir sur les prix. Le total est 10 + 5 = 15.
Modifiez les valeurs et exécutez le programme avec le compilateur Python en ligne CodeUtility, sans installation locale.
Exercices d’approfondissement
Essayez de modifier le code en suivant les pistes ci-dessous. Changer le code et observer le résultat vous fera bien mieux comprendre la leçon que la simple lecture.
- Remplacez le domaine de l’exemple tout en conservant la structure du pattern.
- Comparez le pattern à une implémentation plus simple et expliquez les compromis.
- Écrivez des tests pour chaque participant avant d’ajouter une autre implémentation.