設(shè)計(jì)模式:訪問者模式

什么是訪問者模式
訪問者模式(Visitor Pattern),首先我們擁有一個(gè)由許多對象構(gòu)成的對象結(jié)構(gòu),這些對象的類都擁有一個(gè)accept方法用來接受訪問者對象;訪問者對象是一個(gè)接口,他擁有一個(gè)visit方法,這個(gè)方法對訪問到的對象結(jié)構(gòu)中不同類型的元素作出不同的反應(yīng);在對象結(jié)構(gòu)的一次訪問過程中,我們遍歷整個(gè)對象結(jié)構(gòu),對每一個(gè)元素都實(shí)施accept方法,在每個(gè)元素的accept方法中回調(diào)訪問者的visit方法,從而使訪問者得以處理對象結(jié)構(gòu)的每一個(gè)元素。我們可以針對對象結(jié)構(gòu)設(shè)計(jì)不同的實(shí)在的訪問者類來完成不同的操作。
一句話歸納
將算法與對象結(jié)構(gòu)分離
示例
在十幾年前很難想象到,電腦成為了我們生活中無法或缺的一部分,工作用電腦,吃喝玩樂都在用電腦,電腦簡直成為了我們生活中的一部分,還有一些大膽的人想要把電腦植入到人的體內(nèi),成為新一代“人類”,不過一般電腦由以下主要幾個(gè)部分組成,顯示器、鍵盤、鼠標(biāo)、主機(jī)……等等,顯示器可以提供我們視覺上的享受,鍵盤可以輸入你任何想寫的字,鼠標(biāo)可以提供比鍵盤更靈活的操作……
代碼如下:

適用性
以下場景我建議你考慮使用
一個(gè)對象結(jié)構(gòu)包含很多類對象,他們有不同的接口,而你想對這些對象實(shí)施一些依賴于其具體類的操作,也就是說用迭代器模式已經(jīng)不能勝任的場景。
需要對一個(gè)對象結(jié)構(gòu)中的對象進(jìn)行很多不同的并且不相關(guān)的操作,而需要避免讓這些操作“污染”這些對象的類,使用訪問者模式將這些封裝到類中。
局限性
以下場景我建議你謹(jǐn)慎使用
增加新的元素類很困難。在訪問者模式中,每增加一個(gè)新的元素類,都要在每一個(gè)具體訪問者類中增加相應(yīng)的具體操作,這違背了“開閉原則”。
破壞封裝。訪問者模式中具體元素對訪問者公布細(xì)節(jié),這破壞了對象的封裝性。
違反了依賴倒置原則。訪問者模式依賴了具體類,而沒有依賴抽象類。
END
好兄弟可以點(diǎn)贊并關(guān)注我的公眾號(hào)“javaAnswer”,全部都是干貨。
