鍍金池/ 教程/ Java/ 操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(四)
請(qǐng)求發(fā)送者與接收者解耦——命令模式(四)
對(duì)象間的聯(lián)動(dòng)——觀察者模式(三)
算法的封裝與切換——策略模式(三)
請(qǐng)求發(fā)送者與接收者解耦——命令模式(三)
遍歷聚合對(duì)象中的元素——迭代器模式(四)
請(qǐng)求的鏈?zhǔn)教幚怼氊?zé)鏈模式(二)
自定義語(yǔ)言的實(shí)現(xiàn)——解釋器模式(五)
操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(一)
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(一)
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(三)
操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(二)
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(二)
算法的封裝與切換——策略模式(四)
請(qǐng)求發(fā)送者與接收者解耦——命令模式(六)
撤銷功能的實(shí)現(xiàn)——備忘錄模式(二)
算法的封裝與切換——策略模式(一)
遍歷聚合對(duì)象中的元素——迭代器模式(五)
模板方法模式深度解析(三)
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(五)
自定義語(yǔ)言的實(shí)現(xiàn)——解釋器模式(三)
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(六)
遍歷聚合對(duì)象中的元素——迭代器模式(三)
操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(四)
遍歷聚合對(duì)象中的元素——迭代器模式(一)
算法的封裝與切換——策略模式(二)
請(qǐng)求的鏈?zhǔn)教幚怼氊?zé)鏈模式(一)
遍歷聚合對(duì)象中的元素——迭代器模式(二)
操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(三)
對(duì)象間的聯(lián)動(dòng)——觀察者模式(六)
對(duì)象間的聯(lián)動(dòng)——觀察者模式(五)
請(qǐng)求發(fā)送者與接收者解耦——命令模式(一)
自定義語(yǔ)言的實(shí)現(xiàn)——解釋器模式(六)
自定義語(yǔ)言的實(shí)現(xiàn)——解釋器模式(一)
模板方法模式深度解析(一)
撤銷功能的實(shí)現(xiàn)——備忘錄模式(一)
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(五)
請(qǐng)求的鏈?zhǔn)教幚怼氊?zé)鏈模式(三)
遍歷聚合對(duì)象中的元素——迭代器模式(六)
撤銷功能的實(shí)現(xiàn)——備忘錄模式(三)
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(四)
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(二)
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(四)
對(duì)象間的聯(lián)動(dòng)——觀察者模式(二)
請(qǐng)求發(fā)送者與接收者解耦——命令模式(二)
自定義語(yǔ)言的實(shí)現(xiàn)——解釋器模式(四)
對(duì)象間的聯(lián)動(dòng)——觀察者模式(四)
撤銷功能的實(shí)現(xiàn)——備忘錄模式(五)
自定義語(yǔ)言的實(shí)現(xiàn)——解釋器模式(二)
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(三)
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(一)
撤銷功能的實(shí)現(xiàn)——備忘錄模式(四)
模板方法模式深度解析(二)
撤銷功能的實(shí)現(xiàn)——備忘錄模式(五)
請(qǐng)求發(fā)送者與接收者解耦——命令模式(五)
請(qǐng)求的鏈?zhǔn)教幚怼氊?zé)鏈模式(四)

操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(四)

訪問者模式與組合模式聯(lián)用

在訪問者模式中,包含一個(gè)用于存儲(chǔ)元素對(duì)象集合的對(duì)象結(jié)構(gòu),我們通??梢允褂玫鱽肀闅v對(duì)象結(jié)構(gòu),同時(shí)具體元素之間可以存在整體與部分關(guān)系,有些元素作為容器對(duì)象,有些元素作為成員對(duì)象,可以使用組合模式來組織元素。引入組合模式后的訪問者模式結(jié)構(gòu)圖如圖所示:

http://wiki.jikexueyuan.com/project/design-pattern-behavior/images/1333715011_8778.gif" alt="" />

需要注意的是,在圖所示結(jié)構(gòu)中,由于葉子元素的遍歷操作已經(jīng)在容器元素中完成,因此要防止單獨(dú)將已增加到容器元素中的葉子元素再次加入對(duì)象結(jié)構(gòu)中,對(duì)象結(jié)構(gòu)中只保存容器元素和孤立的葉子元素。

訪問者模式總結(jié)

由于訪問者模式的使用條件較為苛刻,本身結(jié)構(gòu)也較為復(fù)雜,因此在實(shí)際應(yīng)用中使用頻率不是特別高。當(dāng)系統(tǒng)中存在一個(gè)較為復(fù)雜的對(duì)象結(jié)構(gòu),且不同訪問者對(duì)其所采取的操作也不相同時(shí),可以考慮使用訪問者模式進(jìn)行設(shè)計(jì)。在 XML 文檔解析、編譯器的設(shè)計(jì)、復(fù)雜集合對(duì)象的處理等領(lǐng)域訪問者模式得到了一定的應(yīng)用。

主要優(yōu)點(diǎn)

訪問者模式的主要優(yōu)點(diǎn)如下:

(1) 增加新的訪問操作很方便。使用訪問者模式,增加新的訪問操作就意味著增加一個(gè)新的具體訪問者類,實(shí)現(xiàn)簡(jiǎn)單,無須修改源代碼,符合“開閉原則”。

(2) 將有關(guān)元素對(duì)象的訪問行為集中到一個(gè)訪問者對(duì)象中,而不是分散在一個(gè)個(gè)的元素類中。類的職責(zé)更加清晰,有利于對(duì)象結(jié)構(gòu)中元素對(duì)象的復(fù)用,相同的對(duì)象結(jié)構(gòu)可以供多個(gè)不同的訪問者訪問。

(3) 讓用戶能夠在不修改現(xiàn)有元素類層次結(jié)構(gòu)的情況下,定義作用于該層次結(jié)構(gòu)的操作。

主要缺點(diǎn)

訪問者模式的主要缺點(diǎn)如下:

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

(2) 破壞封裝。訪問者模式要求訪問者對(duì)象訪問并調(diào)用每一個(gè)元素對(duì)象的操作,這意味著元素對(duì)象有時(shí)候必須暴露一些自己的內(nèi)部操作和內(nèi)部狀態(tài),否則無法供訪問者訪問。

適用場(chǎng)景

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

(1) 一個(gè)對(duì)象結(jié)構(gòu)包含多個(gè)類型的對(duì)象,希望對(duì)這些對(duì)象實(shí)施一些依賴其具體類型的操作。在訪問者中針對(duì)每一種具體的類型都提供了一個(gè)訪問操作,不同類型的對(duì)象可以有不同的訪問操作。

(2) 需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同的并且不相關(guān)的操作,而需要避免讓這些操作“污染”這些對(duì)象的類,也不希望在增加新操作時(shí)修改這些類。訪問者模式使得我們可以將相關(guān)的訪問操作集中起來定義在訪問者類中,對(duì)象結(jié)構(gòu)可以被多個(gè)不同的訪問者類所使用,將對(duì)象本身與對(duì)象的訪問操作分離。

(3) 對(duì)象結(jié)構(gòu)中對(duì)象對(duì)應(yīng)的類很少改變,但經(jīng)常需要在此對(duì)象結(jié)構(gòu)上定義新的操作。

練習(xí)

Sunny 軟件公司欲為某高校開發(fā)一套獎(jiǎng)勵(lì)審批系統(tǒng),該系統(tǒng)可以實(shí)現(xiàn)教師獎(jiǎng)勵(lì)和學(xué)生獎(jiǎng)勵(lì)的審批(Award Check),如果教師發(fā)表論文數(shù)超過 10 篇或者學(xué)生論文超過2篇可以評(píng)選科研獎(jiǎng),如果教師教學(xué)反饋分大于等于 90 分或者學(xué)生平均成績(jī)大于等于 90 分可以評(píng)選成績(jī)優(yōu)秀獎(jiǎng)。試使用訪問者模式設(shè)計(jì)該系統(tǒng),以判斷候選人集合中的教師或?qū)W生是否符合某種獲獎(jiǎng)要求。