設計模式之訪問者模式

定義

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. (封裝一些做用於某種數據結構中的各元素的操做,它能夠在不改變數據結構的前提下定義做用於這些元素的新的操做。)數據結構

UML類圖

角色:this

  • ObjectStruture 結構對象,大白話就是容器如List,Set,Queue,Map等。
  • Element 元素抽象,就是容器類的元素
  • ConcreateElement 元素的具體實現
  • Vistor 訪問者接口
  • ConcreateVistor 具體訪問者

應用場景

我的以爲是經常使用於迭代當中針對統一抽象不一樣的具體類,作出不一樣的操做,好比如下代碼:code

for(Element element: elementList){
element.accept(visitor1);
element.accept(visitor2);
}

注意了accept的代碼基本上都是直接把本身傳入visitor,即visitor.visitorElement(this)。orm

這裏乍一眼看很普通的一個調用,對調用類來講好像每一個元素就是添加了一個觀察者而已,貌似是走的一套邏輯,這裏是如何實現針對不一樣的Element實現類進行不一樣的操做的勒?原理是對重載和重寫的合理運用。element的accept由不一樣的子類重寫。內部調用了visitor重載的不一樣方法visitorElement(ConcreateElement element),因此這裏實際上根據子類類型作了動態綁定,走的不一樣的邏輯。也許你們又會說那麼爲何要引入一個訪問者勒,直接在子類裏實現重寫方法,不同實現了動態綁定。確實是能夠這麼作,但訪問者模式的意義在引入了了訪問者,封裝了這種不一樣,而不是將這種不一樣分散在一個個實現類當中。對象

相關文章
相關標籤/搜索