访问者模式中的主要角色有访问者、元素、对象结构,目的是为了将对象数据和操作进行分离,特别适用于对象结构稳定但是操作经常变化的情况。示例代码如下:
from abc import ABCMeta, abstractmethod
class Element(metaclass=ABCMeta):
@abstractmethod
def accept(self, visitor):
pass
class ElementA(Element):
def accept(self, visitor):
visitor.visit(self)
def oper(self):
print('oper in ElementA')
class ElementB(Element):
def accept(self, visitor):
visitor.visit(self)
def oper(self):
print('oper in ElementB')
class Visitor(metaclass=ABCMeta):
@abstractmethod
def visit(self, element):
pass
class VisitorA(Visitor):
def visit(self, element):
print('Visit by VisitorA')
element.oper()
class VisitorB(Visitor):
def visit(self, element):
print('Visit by VisitorB')
element.oper()
class ObjectStruct(list):
def accept(self, visitor):
for e in self:
e.accept(visitor)
if __name__ == '__main__':
o = ObjectStruct()
o.append(ElementA())
o.append(ElementB())
o.accept(VisitorA())
o.accept(VisitorB())
输出
Visit by VisitorA
oper in ElementA
Visit by VisitorA
oper in ElementB
Visit by VisitorB
oper in ElementA
Visit by VisitorB
oper in ElementB