Python版
https://github.com/faif/python-patterns/blob/master/behavioral/visitor.py
#!/usr/bin/env python # -*- coding: utf-8 -*- """ http://peter-hoffmann.com/2010/extrinsic-visitor-pattern-python-inheritance.html *TL;DR80 Separates an algorithm from an object structure on which it operates. """ class Node(object): pass class A(Node): pass class B(Node): pass class C(A, B): pass class Visitor(object): def visit(self, node, *args, **kwargs): meth = None for cls in node.__class__.__mro__: meth_name = 'visit_' + cls.__name__ meth = getattr(self, meth_name, None) if meth: break if not meth: meth = self.generic_visit return meth(node, *args, **kwargs) def generic_visit(self, node, *args, **kwargs): print('generic_visit ' + node.__class__.__name__) def visit_B(self, node, *args, **kwargs): print('visit_B ' + node.__class__.__name__) a = A() b = B() c = C() visitor = Visitor() visitor.visit(a) visitor.visit(b) visitor.visit(c) ### OUTPUT ### # generic_visit A # visit_B B # visit_B C