何時采用
訪問者模式適用下面的情況:
l 對象結構中包含很多類型,這些類型沒有統一的接口,而我們又希望使得對象的操作進行統一。
l 希望為對象結構中的類型新增操作,並且不希望改變原有的代碼。
l 對象結構中的一些類型之間發生耦合,而它們的實現又經常會發生變動。
l 針對結構中同一層次的不同類型甚至是不同層次的類型進行迭代。
從這裡可以看出,訪問者模式的主要適用還是針對對象結構(往往有層次關系),並且需要在設計的時候實現為各類型預留接受訪問者的接口。
實現要點
l 每個元素都需要設置Accept()方法來接受訪問者。
l 兩次多態分發,確定訪問者以及訪問者中的方法。
l 如果一個結構層次中有多個類型的元素,那麼可以通過一個ObjectStructure的角色進行封裝。
注意事項
l 訪問者模式一個主要的缺點就是難以擴展對象結構,其實,這點是可以通過一些變化進行化解的。
l 訪問者模式第二個缺點是需要過多暴露對象的內部元素,否則訪問者難以對對象進行實質性的操作。
l 第三個缺點是需要實現考慮到這樣的需求並且提前設置接受訪問者的方法。