生活随笔
收集整理的這篇文章主要介紹了
23种设计模式之访问者模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
訪問(wèn)者模式的定義
定義: 封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)中的各元素的操作, 它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作
通俗的說(shuō), 就是定義一個(gè)訪問(wèn)者角色, 當(dāng)對(duì)指定角色進(jìn)行訪問(wèn)時(shí)要通過(guò)訪問(wèn)者進(jìn)行訪問(wèn)
其類圖如下:
?
各角色說(shuō)明:
Vistor 抽象訪問(wèn)者: 抽象類或接口, 聲明訪問(wèn)者可以訪問(wèn)哪些元素, 具體到程序中就是 visit 方法的參數(shù)定義哪些對(duì)象是可以被訪問(wèn)的ConcreteVistor 具體訪問(wèn)者: 它影響訪問(wèn)者訪問(wèn)到一個(gè)類后該怎么干, 要做什么事Element 抽象元素: 接口或抽象類, 聲明接受哪一類訪問(wèn)者訪問(wèn), 程序上是通過(guò) accept 方法中的參數(shù)來(lái)定義的ConcreteElement 具體元素: 實(shí)現(xiàn) accept方法, 通常是 visitor.visit(this); 基本上都形成一種模式了ObjectStruture 結(jié)構(gòu)對(duì)象: 元素的生成者, 一般容納在多個(gè)不同類、不同接口的容器, 項(xiàng)目中一般很少抽象出這個(gè)角色
抽象元素代碼:
?
具體元素代碼:
?
抽象訪問(wèn)者代碼:
?
具體訪問(wèn)者代碼:
?
結(jié)構(gòu)對(duì)象用來(lái)產(chǎn)生不同的元素對(duì)象, 代碼如下:
?
場(chǎng)景類代碼:
?
通過(guò)增加訪問(wèn)者, 這要是具體元素就非常容易訪問(wèn), 對(duì)元素的遍歷就更加容易了, 甭管它是什么對(duì)象, 只要它在一個(gè)容器中, 都可以通過(guò)訪問(wèn)者來(lái)訪問(wèn), 任務(wù)集中化.
訪問(wèn)者模式的應(yīng)用
訪問(wèn)者模式的優(yōu)點(diǎn):
符合單一職責(zé)原則. 具體元素角色負(fù)責(zé)數(shù)據(jù)的加載, 而訪問(wèn)者角色負(fù)責(zé)報(bào)表的展現(xiàn), 兩個(gè)不同的職責(zé)非常明確的分離開(kāi)來(lái), 各自演繹變化優(yōu)秀的擴(kuò)展. 由于職責(zé)分開(kāi),繼續(xù)增加 對(duì)數(shù)據(jù)的操作是非常快捷的.靈活性非常高. 例如, 當(dāng)需要對(duì)不同的具體元素進(jìn)行分別統(tǒng)計(jì)時(shí), 使用 instanceof 循環(huán)判斷當(dāng)然也可以, 但是現(xiàn)在有一個(gè)好辦法, 那就是把它丟給訪問(wèn)者,由訪問(wèn)者來(lái)進(jìn)行統(tǒng)計(jì)計(jì)算
訪問(wèn)者模式的缺點(diǎn):
具體元素對(duì)訪問(wèn)者公布細(xì)節(jié). 訪問(wèn)者要訪問(wèn)一個(gè)類就必然要求這個(gè)類公布一些方法和數(shù)據(jù), 也就是說(shuō)訪問(wèn)者關(guān)注了其他類的內(nèi)部細(xì)節(jié), 這也是迪米特法則所不建議的具體元素變更比較困難. 具體元素角色的增加、刪除、修改是比較困難的違背了依賴倒置原則. 訪問(wèn)者依賴的是具體元素, 而不是抽象元素, 這破壞了依賴倒置原則, 特別是在面向?qū)ο蟮木幊讨? 拋棄了對(duì) 接口的依賴,而直接依賴實(shí)現(xiàn)類, 擴(kuò)展比較難
訪問(wèn)者模式的應(yīng)用場(chǎng)景:
一個(gè)對(duì)象結(jié)構(gòu)包含很多類對(duì)象, 它們有不同的接口, 而你想對(duì)這些對(duì)象實(shí)施一些依賴于其具體類的操作, 也就是說(shuō)用迭代器模式已經(jīng)不能勝任的情景需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同并且不相關(guān)的操作, 而你想避免讓這些操作"污染"這些對(duì)象的類業(yè)務(wù)規(guī)則要求遍歷多個(gè)不同的對(duì)象. 這本身也是訪問(wèn)者模式的出發(fā)點(diǎn), 訪問(wèn)者模式是對(duì)迭代器模式的擴(kuò)充, 可以便利不同的對(duì)象, 然后執(zhí)行不同的操作, 也就是針對(duì)訪問(wèn)的對(duì)象不同,執(zhí)行不同的操作.訪問(wèn)者模式還有一個(gè) 用途, 充當(dāng)攔截器角色
訪問(wèn)者模式的擴(kuò)展
1.統(tǒng)計(jì)功能
對(duì)不同的具體元素進(jìn)行統(tǒng)計(jì), 針對(duì)不同的具體元素針對(duì)性統(tǒng)計(jì)
比如統(tǒng)計(jì)員工工資, 經(jīng)理和員工的工資情況不同, 使用訪問(wèn)者進(jìn)行分別計(jì)算, 然后可以計(jì)算總額等
2.多個(gè)訪問(wèn)者
可以定義多個(gè)訪問(wèn)者, 每個(gè)訪問(wèn)者實(shí)現(xiàn)不同的功能
在IVistor 下再定義 接口繼承 IVistor, 分別實(shí)現(xiàn)各自功能, 使用時(shí)傳遞不同的訪問(wèn)者有不同的表現(xiàn)
訪問(wèn)者模式是一種集中規(guī)整模式,特別使用于大規(guī)模重構(gòu)的項(xiàng)目, 在這一個(gè)階段需求已經(jīng)非常清晰, 原系統(tǒng)的功能點(diǎn)也已經(jīng)明確, 通過(guò)訪問(wèn)者模式可以很容易把一些功能進(jìn)行梳理, 達(dá)到最終目的--功能集中化, 如一個(gè)統(tǒng)一的報(bào)表運(yùn)算、UI展現(xiàn)等, 我們還可以與其它模式混編建立一套自己的過(guò)濾器或者攔截器
總結(jié)
以上是生活随笔為你收集整理的23种设计模式之访问者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。