設計模式之訪問者模式

訪問者模式,不太好講,因爲這個不太好舉例子,所以印象也不是很深刻。

但是,這個模式它強調是穩定的數據結構,以及經常需要發生變化的操作,操作這種數據結構。

體現在類裏面,就是,一個已經做好的類,封裝好的東西,現在增加了一種操作,那你怎麼辦?

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)        定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結構類經常改變,那麼可能還是在這些類中定義這些操作較好。


訪問者模式的優點:
使得增加新的訪問操作變得很容易。如果一些操作依賴於一個複雜的結構對象的話,那麼一般而言,增加新的操作會很複雜。而使用訪問者模式,增加新的操作就意味着增加一個新的訪問者類,因此,變得很容易。
將有關元素對象的訪問行爲集中到一個訪問者對象中,而不是分散到一個個的元素類中。
訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。迭代子只能訪問屬於同一個類型等級結構的成員對象,而不能訪問屬於不同等級結構的對象。訪問者模式可以做到這一點。
讓用戶能夠在不修改現有類層次結構的情況下,定義該類層次結構的操作
訪問者模式的缺點:
增加新的元素類很困難。在訪問者模式中,每增加一個新的元素類都意味着要在抽象訪問者角色中增加一個新的抽象操作,並在每一個具體訪問者類中增加相應的具體操作,違背了“開閉原則”的要求。
破壞封裝。訪問者模式要求訪問者對象訪問並調用每一個元素對象的操作,這意味着元素對象有時候必須暴露一些自己的內部操作和內部狀態,否則無法供訪問者訪問。

發佈了107 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章