1.意圖
表示一個作用於某對象結構中的各元素的操作。它使你在不改變各元素類的前提下定義作用於這些元素的新操作。
2.適用性
- 一個對象結構包含很多類對象,而你想根據對象的類別對這些對象實施不同的操作。
- 需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而需要避免讓這些操作“污染”這些對象的類,也不希望在增加新操作時修改這些類。
- 對象結構中對象對應的類很少改變,但經常需要在此對象結構上定義新的操作。
3.結構
- 訪問者模式中對象結構存儲了不同類型的元素對象,以供不同訪問者訪問。
- 訪問者模式包括兩個層次結構,一個是訪問者層次結構,提供了抽象訪問者和具體訪問者,一個是元素層次結構,提供了抽象元素和具體元素。
4.實現
- 給訪問者類層次增加一個新的子類即可創建一個新的操作。如JDT中訪問AST結構,只要編譯器接受的語法不改變,即沒有新的類型節點產生,即可以定義新的Visitor子類以增加新的功能。
- 誰負責遍歷對象結構,一般而言由對象結構負責迭代。
5.優缺點
優:
- 使得增加新的訪問操作變得很容易。
- 將有關元素對象的訪問行爲集中到一個訪問者對象中,而不是分散到一個個的元素類中。
- 可以跨過類的等級結構訪問屬於不同的等級結構的元素類。
缺:
- 增加新的元素類很困難,在訪問者模式中,每增加一個新的元素類都意味着要在抽象訪問者角色中增加一個新的抽象操作,並在每一個具體訪問者類中增加相應的具體操作,違背了“開閉原則”的要求。
- 破壞封裝,訪問者模式要求訪問者對象訪問並調用每一個元素對象的操作,這意味着元素對象有時候必須暴露一些自己的內部操作和內部狀態,否則無法供訪問者訪問。