這個模式看上去很厲害, 貌似篇幅也很長 訪問者模式(Visitor Pattern)定義 偽動態雙親委派 表示一個作用於某對象結構中的各種元素的操作. 它使你可以在不改變各元素的前提下定義作用於這些元素的操作 Visitor介面: 它定義了對每一個元素(Elemnent)的訪問行為, 它的方法個數理 ...
訪問者模式(Visitor Pattern)定義 偽動態雙親委派
- 表示一個作用於某對象結構中的各種元素的操作. 它使你可以在不改變各元素的前提下定義作用於這些元素的操作
解析UML
- Visitor介面: 它定義了對每一個元素(Elemnent)的訪問行為, 它的方法個數理論上來講與元素的個數是一致的(Elemnent的實現類的個數)
- ConcreteVisitor: 具體的訪問者, 它要對每一個元素訪問時產生具體的行為
- Elemnent介面: 元素介面, 定義一個接受訪問者(accept)的方法
- ConcreteElement : 具體的元素類, 它提供接受訪問者的具體實現
- ObjectStructure: 訪問者模式中的對象結構, 具體就是,具有容器性質或者符合對象特性的類, 再就是它必須含有一組元素, 並且可以迭代這些元素, 提供給訪問者訪問它的元素
總結: 這個模式就是為了讓訪問者可以方便的訪問對象結構而存在
訪問者模式的特點:
- 訪問者模式將數據結構和作用於結構上的操作解耦合, 使得操作集合可相對自由的演化
- 訪問者模式適用於數據結構相對穩定演算法又易變化的系統. 應為訪問者模式是的演算法操作增加而變得容易. 若系統數據結構對象易於變化, 經常有新的數據對象增加進來, 則不適合使用訪問者模式
- 訪問者模式的優點是增加操作容易, 因為增加操作意味著增加新的訪問者. 訪問者模式將有關行為集中到一個訪問者對象中, 其改變不影響系統數據結構, 其缺點是增加新的數據結構很困難
訪問者模式的優缺點以及適用性
- 優點:
- 使得數據結構和作用於結構上的操作解耦, 是的操作集合可以獨立變化
- 添加新的操作或者說訪問者會非常的容易
- 將各個元素的一組操作集中在一個訪問者類中
- 使得類層次結構不改變的情況下, 可以針對各個層次做出不同的操作, 而不影響類層次結構的完整性
- 可以跨越類層次結構, 訪問不同層次的元素類, 做出相應的操作
- 缺點:
- 增加新的元素非常的困難
- 實現起來比較複雜
- 破壞封裝, 如果將訪問行為放在各個元素中門, 則可以不暴露元素的內出就夠和狀態, 但使用訪問者模式的時候, 為了讓訪問者能獲得新的信息, 元素類不得不暴露一些內部的狀態和結構
- 適用性:
- 數據結構穩定, 作用於數據結構操作經常變化的時候
- 當一個數據結構中, 一些元素類需要負責與其不相關的操作的時候, 為了將這些操作分離出去, 以減少這些元素類的職責時. 可以使用該模式
- 有時在對數據結構上的原型進行操作的時候, 需要區分具體的類型, 這時使用訪問者模式可以針對不同的類型, 在訪問者類中定義不同的操作, 從而去除類型判斷.
高級講解
- 靜態分派以及多分派:
- 按照變數的靜態類型進行分派, 從而確定方法的執行版本, 靜態分派在編譯時期就可以確定方法的版本. 靜態分批最典型的就是方法的重載
- 在靜態分派的判斷的時候, 根據多個判斷依據判斷出方法的依據, 這就是多分派的概念
- 動態分派與單分派:
- 與 靜態分派相反, 典型的就是多態
- 在動態分派的判斷下, 獲取到多態下 實際引用類型, 判斷依據是實際引用類型只有一個判斷依據, 這就是單分派的概念
- 動態分派偽雙分派:
- accept調用訪問者, 根據元素的實際類型, 調用實際的accept
- accept版本確定的情況下, 其中的訪問者的類型再次確認, 實現動態雙分派的過程
- 這裡的雙分, 實際上是不同多態的單次判斷: 我的理解
訪問者模式多層次操作
- 看UML, 簡單明瞭
- 可以加抽象, 繼承, 形成多個層次的繼承實現繼承體系
- 調用介面規範的方法的時候, 各個層次操作不會改變層次原本結構, 操作隨你定