在訪問者模式中,包含乙個用於儲存元素物件集合的物件結構,我們通常可以使用迭代器來遍歷物件結構,同時具體元素之間可以存在整體與部分關係,有些元素作為容器物件,有些元素作為成員物件,可以使用組合模式來組織元素。引入組合模式後的訪問者模式結構圖如圖26-4所示:
需要注意的是,在圖26-4所示結構中,由於葉子元素的遍歷操作已經在容器元素中完成,因此要防止單獨將已增加到容器元素中的葉子元素再次加入物件結構中,物件結構中只儲存容器元素和孤立的葉子元素。
由於訪問者模式的使用條件較為苛刻,本身結構也較為複雜,因此在實際應用中使用頻率不是特別高。當系統中存在乙個較為複雜的物件結構,且不同訪問者對其所採取的操作也不相同時,可以考慮使用訪問者模式進行設計。在xml文件解析、編譯器的設計、複雜集合物件的處理等領域訪問者模式得到了一定的應用。
1.主要優點
訪問者模式的主要優點如下:
(1) 增加新的訪問操作很方便。使用訪問者模式,增加新的訪問操作就意味著增加乙個新的具體訪問者類,實現簡單,無須修改源**,符合「開閉原則」。
(2) 將有關元素物件的訪問行為集中到乙個訪問者物件中,而不是分散在乙個個的元素類中。類的職責更加清晰,有利於物件結構中元素物件的復用,相同的物件結構可以供多個不同的訪問者訪問。
(3) 讓使用者能夠在不修改現有元素類層次結構的情況下,定義作用於該層次結構的操作。
2.主要缺點
訪問者模式的主要缺點如下:
(1) 增加新的元素類很困難。在訪問者模式中,每增加乙個新的元素類都意味著要在抽象訪問者角色中增加乙個新的抽象操作,並在每乙個具體訪問者類中增加相應的具體操作,這違背了「開閉原則」的要求。
(2) 破壞封裝。訪問者模式要求訪問者物件訪問並呼叫每乙個元素物件的操作,這意味著元素物件有時候必須暴露一些自己的內部操作和內部狀態,否則無法供訪問者訪問。
3.適用場景
在以下情況下可以考慮使用訪問者模式:
(1) 乙個物件結構包含多個型別的物件,希望對這些物件實施一些依賴其具體型別的操作。在訪問者中針對每一種具體的型別都提供了乙個訪問操作,不同型別的物件可以有不同的訪問操作。
(2) 需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作「汙染」這些物件的類,也不希望在增加新操作時修改這些類。訪問者模式使得我們可以將相關的訪問操作集中起來定義在訪問者類中,物件結構可以被多個不同的訪問者類所使用,將物件本身與物件的訪問操作分離。
(3) 物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作。
練習
sunny軟體公司欲為某高校開發一套獎勵審批系統,該系統可以實現教師獎勵和學生獎勵的審批(award check),如果教師發表**數超過10篇或者學生**超過2篇可以評選科研獎,如果教師教學反饋分大於等於90分或者學生平均成績大於等於90分可以評選成績優秀獎。試使用訪問者模式設計該系統,以判斷候選人集合中的教師或學生是否符合某種獲獎要求。
操作複雜物件結構 訪問者模式(四)
在訪問者模式中,包含乙個用於儲存元素物件集合的物件結構,我們通常可以使用迭代器來遍歷物件結構,同時具體元素之間可以存在整體與部分關係,有些元素作為容器物件,有些元素作為成員物件,可以使用組合模式來組織元素。引入組合模式後的訪問者模式結構圖如圖26 4所示 需要注意的是,在圖26 4所示結構中,由於葉...
訪問者模式 物件行為模式
終於到最後乙個模式了,意圖 表示乙個作用於某物件結構中的各元素的操作。它使你可以再不改變各元素的類的前提下定義作用於這些元素的新操作。動機 使用visitor 模式,必須定義兩個類層次 乙個對應於接受操作的元素,另乙個對應於定義對元素的操作的訪問者 visitor 給訪問者類層次增加乙個新的子類即可...
訪問者模式
訪問者模式 visitor pattern 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。一 問題 集合是大多數的系統都要處理的一種容器物件,它儲存了對其它物件的引用。一般情況下,在集合上採取的...