python版本的访问者模式

# -*- 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)

 

posted @ 2018-01-25 13:46  gjw  阅读(100)  评论(0)    收藏  举报