Python 访问者模式

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 29 16:52:56 2018

@author: mz
"""

class Aggregate(object):
    def __init__(self):
        self._elmlst = []
    
    def Attach(self, elm):
        self._elmlst.append(elm)       
    
    def Accept(self, vistor):
        for e in self._elmlst:
            e.Accept(vistor)
    

class Element(object):   
    def __init__(self):
        self.permitted = True
        self.name = ""
    
    def Accept(self, visitor):
       pass
           

class RollerCoaster(Element):    
    def Accept(self, visitor):
        self.name = "Roller coaster"
        if  visitor.__class__.__name__ ==  "Boy":
            self.permitted = False
        else:
            self.permitted = True
        visitor.Visit(self)
    
class PirateBoat(Element):    
    def Accept(self, visitor):
        self.name = "Pirate Boat"
        self.permitted = True
        visitor.Visit(self)
        
class Visitor(object):    
    def Visit(self, elm):
        pass

class Boy(Visitor):
    def Visit(self, elm):
        print("Boy visits %s, permitted: %s " % (elm.name,  elm.permitted))

class Adult(Visitor):
    def Visit(self, elm):
        print("Adult visits %s, permitted: %s"  % (elm.name,  elm.permitted))

if "__main__" == __name__:
    aggrea = Aggregate()
    
    elmRoller = RollerCoaster()
    elmPirate = PirateBoat()
    
    aggrea.Attach(elmRoller)
    aggrea.Attach(elmPirate)
    
    boy = Boy()
    adult = Adult()
    
    print("---boy visits---")
    aggrea.Accept(boy)
    
    print("\r\n---adult visits---")
    aggrea.Accept(adult)
    

运行结果:

---boy visits---
Boy visits Roller coaster, permitted: False 
Boy visits Pirate Boat, permitted: True 

---adult visits---
Adult visits Roller coaster, permitted: True
Adult visits Pirate Boat, permitted: True

猜你喜欢

转载自blog.csdn.net/mz5111089/article/details/79747671
今日推荐