訪問者模式:表示一個作用於某對象結構中的各元素的操作。它可以使你在不改變各元素的類的前提下定義作用於這些元素的新操作。
訪問者模式適用於資料結構相對穩定而基於該資料結構的操作需要經常擴充的系統。因為該模式的優點就是增加新的操作很容易。
#encoding=utf-8##by panda#訪問模式def printInfo(info): print unicode(info, 'utf-8').encode('gbk')#基本資料結構:class Person(): def Accept(self, visitor): pass class Man(Person): type = '男人' def Accept(self, visitor): visitor.GetManConclusion(self)class Woman(Person): type = '女人' def Accept(self, visitor): visitor.GetWomanConclusion(self)#基於資料結構的操作class Action(): def GetManConclusion(self, person): pass def GetWomanConclusion(self, person): passclass Success(Action): type = '成功' def GetManConclusion(self, person): printInfo('%s %s時,背後多半有一個偉大的女人' %(person.type, self.type)) def GetWomanConclusion(self, person): printInfo('%s %s時,背後大多有一個不成功的男人' %(person.type, self.type))class Failing(Action): type = '失敗' def GetManConclusion(self, person): printInfo('%s %s時,悶頭喝酒,誰也不用勸' %(person.type, self.type)) def GetWomanConclusion(self, person): printInfo('%s %s時,眼淚汪汪,誰也勸不了' %(person.type, self.type))class Love(Action): type = '戀愛' def GetManConclusion(self, person): printInfo('%s %s時,凡是不懂也要裝懂' %(person.type, self.type)) def GetWomanConclusion(self, person): printInfo('%s %s時,遇事懂也裝作不懂' %(person.type, self.type))#對象結構類:遍曆資料結構的操作class ObjectStructure: elements = [] def Attach(self, element): self.elements.append(element) def Detach(self, element): self.elements.remove(element) def Display(self, visitor): for e in self.elements: e.Accept(visitor) def clientUI(): o = ObjectStructure() o.Attach(Man()) o.Attach(Woman()) o.Display(Success()) o.Display(Failing()) o.Display(Love()) returnif __name__ == '__main__': clientUI();
類圖: