Android設(shè)計模式-15-訪問者模式

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)中的對象進行很多不同的并且不相關(guān)的操作,而需要避免這些操作污染這些對象的類,也不希望在增加新操作時修改這些類

3. 優(yōu)缺點

優(yōu)點:

符合單一職責(zé)原則

優(yōu)秀的擴展性

靈活性

缺點:

具體元素對訪問者公布細(xì)節(jié),違反了迪米特原則

具體元素變更比較困難

違反了依賴倒置原則,依賴了具體類,沒有依賴抽象

4. Android源碼中的使用

Android中編譯期注解(依賴APT(Annotation Processing Tools)實現(xiàn)), 其內(nèi)部就有使用訪問者模式,Element及其子類(包元素PackageElement,類型元素TypeElement等)是被訪問者,其中的accept方法接收一個ElementVisitor類型的訪問者,ElementVisitor中有多個visit方法處理不同類型的元素, 比較著名的ButterKnife,Dagger,Retrofit等開源庫都有使用編譯期注解實現(xiàn)

5. 實例演示

訪問者模式并不常用,其關(guān)鍵點在于: 在數(shù)據(jù)基礎(chǔ)類(被訪問者)里面有一個方法,接受訪問者,將自身引用傳入訪問者,以供調(diào)用;

以員工績效評定為例,人事主管和技術(shù)主管考核的點是不同的,人事主管對所有員工的考核方式都是看kpi,而技術(shù)主管考核員工則不同,如對于程序員是看代碼量,對于產(chǎn)品經(jīng)理是看產(chǎn)品數(shù)量(以上只是簡單的設(shè)定一下代碼邏輯,并不代表真實情況)

1.1 首先創(chuàng)建一個員工基類(被訪問者)

1.2 兩個員工的實現(xiàn)類:工程師類和產(chǎn)品經(jīng)理類

2.1 創(chuàng)建一個訪問者基類

2.2 兩個訪問者實現(xiàn)類, 人事主管和技術(shù)主管

3. 創(chuàng)建一個員工的集合類,相當(dāng)于現(xiàn)實中的業(yè)績報表

4. 創(chuàng)建實例進行調(diào)用

我是今陽,如果想要進階和了解更多的干貨,歡迎關(guān)注公眾號”今陽說“接收我的最新文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容