Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. (封裝一些做用於某種數據結構中的各元素的操做,它能夠在不改變數據結構的前提下定義做用於這些元素的新的操做。)數據結構
角色:this
我的以爲是經常使用於迭代當中針對統一抽象不一樣的具體類,作出不一樣的操做,好比如下代碼:code
for(Element element: elementList){ element.accept(visitor1); element.accept(visitor2); }
注意了accept的代碼基本上都是直接把本身傳入visitor,即visitor.visitorElement(this)。orm
這裏乍一眼看很普通的一個調用,對調用類來講好像每一個元素就是添加了一個觀察者而已,貌似是走的一套邏輯,這裏是如何實現針對不一樣的Element實現類進行不一樣的操做的勒?原理是對重載和重寫的合理運用。element的accept由不一樣的子類重寫。內部調用了visitor重載的不一樣方法visitorElement(ConcreateElement element),因此這裏實際上根據子類類型作了動態綁定,走的不一樣的邏輯。也許你們又會說那麼爲何要引入一個訪問者勒,直接在子類裏實現重寫方法,不同實現了動態綁定。確實是能夠這麼作,但訪問者模式的意義在引入了了訪問者,封裝了這種不一樣,而不是將這種不一樣分散在一個個實現類當中。對象