模式 / 行为模式
image

from abc import ABCabstractmethod


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)