訪問者模式,不太好講,因爲這個不太好舉例子,所以印象也不是很深刻。
但是,這個模式它強調是穩定的數據結構,以及經常需要發生變化的操作,操作這種數據結構。
體現在類裏面,就是,一個已經做好的類,封裝好的東西,現在增加了一種操作,那你怎麼辦?
1,你可以重新寫這個類,直接加個操作。可是,這樣違背了“開閉原則”,當你這個操作經常發生變化時,就是不可行的。
2.你該把這個操作,單獨的寫一個類,對操作進行封裝。讓他作爲一個“訪問者”可以訪問需要進行操作的數據結構。
而你的這個需要操作的數據結構,則需要,有個accept()的方法,來表示,我接受,你們這些訪問者。
這樣,在不需要改動以前的類的基礎上,就增加了這個新的操作。
以下是訪問者模式的組成結構:
1) 訪問者角色(Visitor):爲該對象結構中具體元素角色聲明一個訪問操作接口。該操作接口的名字和參數標識了發送訪問請求給具體訪問者的具體元素角色。這樣訪問者就可以通過該元素角色的特定接口直接訪問它。
2) 具體訪問者角色(Concrete Visitor):實現每個由訪問者角色(Visitor)聲明的操作。
3) 元素角色(Element):定義一個Accept操作,它以一個訪問者爲參數。
4) 具體元素角色(Concrete Element):實現由元素角色提供的Accept操作。
5) 對象結構角色(Object Structure):這是使用訪問者模式必備的角色。它要具備以下特徵:能枚舉它的元素;可以提供一個高層的接口以允許該訪問者訪問它的元素;可以是一個複合(組合模式)或是一個集合,如一個列表或一個無序集合。
《設計模式》一書中給出了訪問者模式適用的情況:
1) 一個對象結構包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴於其具體類的操作。
2) 需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而你想避免讓這些操作“污染”這些對象的類。Visitor使得你可以將相關的操作集中起來定義在一個類中。
3) 當該對象結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。
4) 定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結構類經常改變,那麼可能還是在這些類中定義這些操作較好。