1. 定義
封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)中的各元素的操作,它可以在不改變這個數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作
將數(shù)據(jù)操作與數(shù)據(jù)結(jié)構(gòu)分離
2. 使用場景
對象結(jié)構(gòu)比較穩(wěn)定,但經(jīng)常需要在此對象結(jié)構(gòu)上定義新的操作
需要對一個對象結(jié)構(gòu)中的對象進(jìn)行很多不同的并且不相關(guān)的操作贡避,而需要避免這些操作污染這些對象的類,也不希望在增加新操作時修改這些類
3. 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
符合單一職責(zé)原則
優(yōu)秀的擴(kuò)展性
靈活性
缺點(diǎn):
具體元素對訪問者公布細(xì)節(jié),違反了迪米特原則
具體元素變更比較困難
違反了依賴倒置原則兴溜,依賴了具體類异雁,沒有依賴抽象
4. Android源碼中的使用
Android中編譯期注解(依賴APT(Annotation Processing Tools)實(shí)現(xiàn)), 其內(nèi)部就有使用訪問者模式舌仍,Element及其子類(包元素PackageElement着绊,類型元素TypeElement等)是被訪問者铆隘,其中的accept方法接收一個ElementVisitor類型的訪問者,ElementVisitor中有多個visit方法處理不同類型的元素, 比較著名的ButterKnife,Dagger,Retrofit等開源庫都有使用編譯期注解實(shí)現(xiàn)
5. 實(shí)例演示
訪問者模式并不常用叫确,其關(guān)鍵點(diǎn)在于: 在數(shù)據(jù)基礎(chǔ)類(被訪問者)里面有一個方法跳芳,接受訪問者,將自身引用傳入訪問者竹勉,以供調(diào)用飞盆;
以員工績效評定為例,人事主管和技術(shù)主管考核的點(diǎn)是不同的次乓,人事主管對所有員工的考核方式都是看kpi吓歇,而技術(shù)主管考核員工則不同,如對于程序員是看代碼量票腰,對于產(chǎn)品經(jīng)理是看產(chǎn)品數(shù)量(以上只是簡單的設(shè)定一下代碼邏輯城看,并不代表真實(shí)情況)
1.1 首先創(chuàng)建一個員工基類(被訪問者)
1.2 兩個員工的實(shí)現(xiàn)類:工程師類和產(chǎn)品經(jīng)理類
2.1 創(chuàng)建一個訪問者基類
2.2 兩個訪問者實(shí)現(xiàn)類, 人事主管和技術(shù)主管
3. 創(chuàng)建一個員工的集合類,相當(dāng)于現(xiàn)實(shí)中的業(yè)績報表
4. 創(chuàng)建實(shí)例進(jìn)行調(diào)用
我是今陽丧慈,如果想要進(jìn)階和了解更多的干貨析命,歡迎關(guān)注公眾號”今陽說“接收我的最新文章