操作複雜物件結構——訪問者模式(四)

Liuwei-Sunny發表於2012-04-06

26.4 訪問者模式與組合模式聯用

      在訪問者模式中,包含一個用於儲存元素物件集合的物件結構,我們通常可以使用迭代器來遍歷物件結構,同時具體元素之間可以存在整體與部分關係,有些元素作為容器物件,有些元素作為成員物件,可以使用組合模式來組織元素。引入組合模式後的訪問者模式結構圖如圖26-4所示:

         需要注意的是,在圖26-4所示結構中,由於葉子元素的遍歷操作已經在容器元素中完成,因此要防止單獨將已增加到容器元素中的葉子元素再次加入物件結構中,物件結構中只儲存容器元素和孤立的葉子元素。

26.5 訪問者模式總結

      由於訪問者模式的使用條件較為苛刻,本身結構也較為複雜,因此在實際應用中使用頻率不是特別高。當系統中存在一個較為複雜的物件結構,且不同訪問者對其所採取的操作也不相同時,可以考慮使用訪問者模式進行設計。在XML文件解析、編譯器的設計、複雜集合物件的處理等領域訪問者模式得到了一定的應用。

1.主要優點

      訪問者模式的主要優點如下:

(1) 增加新的訪問操作很方便。使用訪問者模式,增加新的訪問操作就意味著增加一個新的具體訪問者類,實現簡單,無須修改原始碼,符合“開閉原則”。

(2) 將有關元素物件的訪問行為集中到一個訪問者物件中,而不是分散在一個個的元素類中。類的職責更加清晰,有利於物件結構中元素物件的複用,相同的物件結構可以供多個不同的訪問者訪問。

(3) 讓使用者能夠在不修改現有元素類層次結構的情況下,定義作用於該層次結構的操作。

2.主要缺點

      訪問者模式的主要缺點如下:

(1) 增加新的元素類很困難。在訪問者模式中,每增加一個新的元素類都意味著要在抽象訪問者角色中增加一個新的抽象操作,並在每一個具體訪問者類中增加相應的具體操作,這違背了“開閉原則”的要求。

(2) 破壞封裝。訪問者模式要求訪問者物件訪問並呼叫每一個元素物件的操作,這意味著元素物件有時候必須暴露一些自己的內部操作和內部狀態,否則無法供訪問者訪問。

3.適用場景

      在以下情況下可以考慮使用訪問者模式:

(1) 一個物件結構包含多個型別的物件,希望對這些物件實施一些依賴其具體型別的操作。在訪問者中針對每一種具體的型別都提供了一個訪問操作,不同型別的物件可以有不同的訪問操作。

(2) 需要對一個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作“汙染”這些物件的類,也不希望在增加新操作時修改這些類。訪問者模式使得我們可以將相關的訪問操作集中起來定義在訪問者類中,物件結構可以被多個不同的訪問者類所使用,將物件本身與物件的訪問操作分離。

(3) 物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作。

 

練習

Sunny軟體公司欲為某高校開發一套獎勵審批系統,該系統可以實現教師獎勵和學生獎勵的審批(Award Check),如果教師發表論文數超過10篇或者學生論文超過2篇可以評選科研獎,如果教師教學反饋分大於等於90分或者學生平均成績大於等於90分可以評選成績優秀獎。試使用訪問者模式設計該系統,以判斷候選人集合中的教師或學生是否符合某種獲獎要求。

【作者:劉偉 http://blog.csdn.net/lovelion

相關文章