
from abc import ABC, abstractmethod
class Element(ABC):
@abstractmethod
def accept(self, v):
pass
# ConcreteElement
class Engine(Element):
def accept(self, v):
v.visit_engine(self)
# ConcreteElement
class Wheel(Element):
def __init__(self, number):
self.number = number
def accept(self, v):
v.visit_wheel(self)
# ConcreteElement
class Car(Element):
def __init__(self):
self.items = [
Engine(),
Wheel(1), Wheel(2),
Wheel(3), Wheel(4)]
def accept(self, v):
for e in self.items:
e.accept(v)
v.visit_car(self)
# Visitor
class CarVisitor(ABC):
@abstractmethod
def visit_engine(self, engine):
pass
@abstractmethod
def visit_wheel(self, wheel):
pass
@abstractmethod
def visit_car(self, car):
pass
# ConcreteVisitor
class ScanCarVisitor(CarVisitor):
def visit_engine(self, engine):
print("scan engine")
def visit_wheel(self, wheel):
print("scan wheel #" +
str(wheel.number))
def visit_car(self, car):
print("scan car")
# ConcreteVisitor
class RepairCarVisitor(CarVisitor):
def visit_engine(self, engine):
print("repair engine")
def visit_wheel(self, wheel):
print("repair wheel #" +
str(wheel.number))
def visit_car(self, car):
print("repair car")
# Client
testCar = Car()
v1 = ScanCarVisitor()
v2 = RepairCarVisitor()
testCar.accept(v1)
testCar.accept(v2)