# -*- coding:UTF-8 -*-
from abc import ABCMeta, abstractmethod
class Visitor(metaclass=ABCMeta):
@abstractmethod
def visit_concrete_elementA(self, concrete_elementA):
pass
@abstractmethod
def visit_concrete_elementB(self, concrete_elementB):
pass
class ConcreteVisitor1(Visitor):
def visit_concrete_elementA(self, concrete_elementA):
print("{}被{}访问".format(concrete_elementA.__class__.__name__, self.__class__.__name__))
def visit_concrete_elementB(self, concrete_elementB):
print("{}被{}访问".format(concrete_elementB.__class__.__name__, self.__class__.__name__))
class ConcreteVisitor2(Visitor):
def visit_concrete_elementA(self, concrete_elementA):
print("{}被{}访问".format(concrete_elementA.__class__.__name__, self.__class__.__name__))
def visit_concrete_elementB(self, concrete_elementB):
print("{}被{}访问".format(concrete_elementB.__class__.__name__, self.__class__.__name__))
class Element(metaclass=ABCMeta):
@abstractmethod
def accept(self, visitor):
pass
class ConcreteElementA(Element):
def accept(self, visitor):
visitor.visit_concrete_elementA(self)
def operationA(self):
pass
class ConcreteElementB(Element):
def accept(self, visitor):
visitor.visit_concrete_elementB(self)
def operationB(self):
pass
class ObjectStructure:
def __init__(self):
self.__elements = []
def attach(self,element):
self.__elements.append(element)
def detach(self,element):
self.__elements.remove(element)
def accept(self,visitor):
for e in self.__elements:
e.accept(visitor)
if __name__=="__main__":
o = ObjectStructure()
o.attach(ConcreteElementA())
o.attach(ConcreteElementB())
v1 = ConcreteVisitor1()
v2 = ConcreteVisitor2()
o.accept(v1)
o.accept(v2)