class ComputerPart(ABC):
@abstractmethod
def accept(self, computerPartVisitor: 'ComputerPartVisitor'):
raise NotImplemented
class Keyboard(ComputerPart):
def accept(self, computerPartVisitor: 'ComputerPartVisitor'):
computerPartVisitor.visitKeyboard(self)
class Monitor(ComputerPart):
def accept(self, computerPartVisitor: 'ComputerPartVisitor'):
computerPartVisitor.visitMonitor(self)
class Mouse(ComputerPart):
def accept(self, computerPartVisitor: 'ComputerPartVisitor'):
computerPartVisitor.visitMouse(self)
class Computer(ComputerPart):
parts: List[ComputerPart]
def __init__(self):
self.parts = []
self.parts.append(Mouse())
self.parts.append(Keyboard())
self.parts.append(Monitor())
def accept(self, computerPartVisitor: 'ComputerPartVisitor'):
for i in range(len(self.parts)):
self.parts[i].accept(computerPartVisitor)
computerPartVisitor.visitComputer(self)
class ComputerPartVisitor(ABC):
@abstractmethod
def visitComputer(self, inComputer):
raise NotImplemented
@abstractmethod
def visitMouse(self, inMouse):
raise NotImplemented
@abstractmethod
def visitKeyboard(self, inKeyboard):
raise NotImplemented
@abstractmethod
def visitMonitor(self, inMonitor):
raise NotImplemented
class ComputerPartDisplayVisitor(ComputerPartVisitor):
def visitComputer(self, inComputer):
print("Displaying {0}. Called in {1}".format(inComputer.__class__.__name__, self.__class__.__name__))
def visitMouse(self, inMouse):
print("Displaying {0}. Called in {1}".format(inMouse.__class__.__name__, self.__class__.__name__))
def visitKeyboard(self, inKeyboard):
print("Displaying {0}. Called in {1}".format(inKeyboard.__class__.__name__, self.__class__.__name__))
def visitMonitor(self, inMonitor):
print("Displaying {0}. Called in {1}".format(inMonitor.__class__.__name__, self.__class__.__name__))
class VisitorPatternDemo:
def __init__(self):
computer: Computer = Computer()
computer.accept(ComputerPartDisplayVisitor())
if __name__ == '__main__':
VisitorPatternDemo()
Displaying Mouse. Called in ComputerPartDisplayVisitor
Displaying Keyboard. Called in ComputerPartDisplayVisitor
Displaying Monitor. Called in ComputerPartDisplayVisitor
Displaying Computer. Called in ComputerPartDisplayVisitor