Patrons de conception Python

Visitor Pattern in Python

Add a new operation, such as calculating total area, to a set of classes without editing those classes.

  • Avancé
  • 3 min de lecture
  • 1 exemple exécutable
Ce que vous allez apprendre
  • Elements with accept(visitor)
  • Visitors with one method per element type
  • Double dispatch
PriceVisitor
  • PriceVisitortotal = 15
    • Book().accept()visit_book → 10
    • Movie().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

  1. Each element calls the visitor method for its own type.
  2. A new operation means a new visitor class.
  3. 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

Exécuter le code →
main.py
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()]))
Obtenir un bouton Run pour cet exemple

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.

  1. Remplacez le domaine de l’exemple tout en conservant la structure du pattern.
  2. Comparez le pattern à une implémentation plus simple et expliquez les compromis.
  3. Écrivez des tests pour chaque participant avant d’ajouter une autre implémentation.
Exécuter dans le compilateur Python →