- 訪問者模式的目的是封裝一些施加於某種數據結構元素之上的操做
- 一旦這些操做須要修改的話,接受這個操做的數據結構則能夠保持不變
分派的概念算法
- 變量被聲明時的類型叫作變量的靜態類型(Static Type),有些人又把靜態類型叫作明顯類型(Apparent Type)
- 而變量所引用的對象的真實類型又叫作變量的實際類型(Actual Type)
- 聲明瞭一個變量list,它的靜態類型(也叫明顯類型)是List,而它的實際類型是ArrayList
根據對象的類型而對方法進行的選擇,就是分派(Dispatch),分派(Dispatch)又分爲兩種,即靜態分派和動態分派設計模式
靜態分派(Static Dispatch)發生在編譯時期,分派根據靜態類型信息發生數據結構
- 靜態分派對於咱們來講並不陌生,方法重載就是靜態分派
動態分派(Dynamic Dispatch)發生在運行時期,動態分派動態地置換掉某個方法spa
分派的類型
- 一個方法所屬的對象叫作方法的接收者
- 方法的接收者與方法的參數統稱作方法的宗量
- Java就是動態的單分派語言,由於這種語言的動態分派僅僅會考慮到方法的接收者的類型
- 同時又是靜態的多分派語言,由於這種語言對重載方法的分派會考慮到方法的接收者的類型以及方法的全部參數的類型
雙重分派
訪問者設計模式的結構
- 訪問者模式適用於數據結構相對未定的系統,它把數據結構和做用於結構上的操做之間的耦合解脫開,使得操做集合能夠相對自由地演化
- 數據結構的每個節點均可以接受一個訪問者的調用,此節點向訪問者對象傳入節點對象,而訪問者對象則反過來執行節點對象的操做
- 這樣的過程叫作「雙重分派」。節點調用訪問者,將它本身傳入,訪問者則將某算法針對此節點執行
訪問者模式的優勢
● 好的擴展性3d
可以在不修改對象結構中的元素的狀況下,爲對象結構中的元素添加新的功能。對象
● 好的複用性blog
能夠經過訪問者來定義整個對象結構通用的功能,從而提升複用程度。接口
● 分離無關行爲it
能夠經過訪問者來分離無關的行爲,把相關的行爲封裝在一塊兒,構成一個訪問者,這樣每個訪問者的功能都比較單一。
訪問者模式的缺點
● 對象結構變化很困難
不適用於對象結構中的類常常變化的狀況,由於對象結構發生了改變,訪問者的接口和訪問者的實現都要發生相應的改變,代價過高。
● 破壞封裝
訪問者模式一般須要對象結構開放內部數據給訪問者和ObjectStructrue,這破壞了對象的封裝性。