设计模式之访问者
訪問者模式介紹
訪問者模式能將算法與其所作用的對象隔離開來。
訪問者模式建議將新行為放入要給名為訪問者的獨(dú)立類中,而不是試圖將其整合到已有類中。
它允許你在不修改已有代碼的情況下向已有類層次結(jié)構(gòu)中增加新的行為。
需要執(zhí)行操作的原始對象將作為參數(shù)被傳遞給訪問者中的方法,讓方法能訪問對象所包含的一切必要數(shù)據(jù)。
簡單理解下什么是訪問者,這里使用保險(xiǎn)代理人拜訪不同層次的客戶時(shí)為例子。他會(huì)根據(jù)不同的客戶,推薦不同的保單。
普通農(nóng)民工,推薦醫(yī)療保險(xiǎn)。
普通打工人,推薦醫(yī)療保險(xiǎn)和財(cái)產(chǎn)保險(xiǎn)。
企業(yè)家,推薦理財(cái)保險(xiǎn),年金等。
訪問者模式結(jié)構(gòu)
訪問者接口
聲明一系列以對象結(jié)構(gòu)的具體元素為參數(shù)的訪問者方法。
具體訪問者
會(huì)為不同的具體元素類實(shí)現(xiàn)相同行為的幾個(gè)不同版本。
元素接口
聲明一個(gè)方法來接收訪問者。該方法必須有一個(gè)參數(shù)被聲明為訪問者接口類型。
具體元素
實(shí)現(xiàn)元素接口方法,該方法的目的是根據(jù)當(dāng)前元素類將其調(diào)用重定向到相應(yīng)訪問者的方法(注意:即使基類實(shí)現(xiàn)了此方法,所有子類都必須對其進(jìn)行重寫并調(diào)用訪問者對象中的合適方法)。
客戶端
作為集合或其他復(fù)雜對象的代表。
適合應(yīng)用場景
需要對一個(gè)復(fù)雜對象結(jié)構(gòu)中所有元素執(zhí)行某些操作時(shí)。
使用訪問者模式來清理輔助行為的業(yè)務(wù)邏輯時(shí)。
當(dāng)某個(gè)行為只在類層次有意義,而在其他類中沒有意義時(shí)。
實(shí)現(xiàn)方式
1、在訪問者接口中聲明一組“訪問”方法,分別對應(yīng)程序中的每個(gè)具體元素類。
2、聲明元素接口,在具體原始類中實(shí)現(xiàn)接收方法。
3、元素類只能通過訪問者接口與訪問者進(jìn)行交互(訪問者必須知曉所有具體的元素類)。
4、為每個(gè)無法在元素層次結(jié)構(gòu)中實(shí)現(xiàn)的行為創(chuàng)建一個(gè)具體訪問者并實(shí)現(xiàn)所有的訪問者方法。
5、客戶端必須創(chuàng)建訪問者對象并通過“接收”方法將其傳遞給元素。
優(yōu)點(diǎn)
1、滿足開閉原則和單一職責(zé)原則。
2、訪問者對象可以在與各種對象交互時(shí)收集一些有用的信息。
缺點(diǎn)
1、每次在元素層次結(jié)構(gòu)中添加或移除一個(gè)類時(shí),你都要更新所有的訪問者。
2、在訪問者同某個(gè)元素進(jìn)行交互時(shí),它們可能沒有訪問元素私有成員變量和方法的必要權(quán)限。
Demo
元素接口與元素接口實(shí)現(xiàn)
元素接口與元素接口實(shí)現(xiàn)訪問者接口與接口實(shí)現(xiàn)
訪問者接口與接口實(shí)現(xiàn)客戶端代碼與Main()調(diào)用
客戶端代碼與Main()調(diào)用訪問者模式在常規(guī)的編碼生活中很少會(huì)去使用,我們只需要掌握其原理就可以。對于在實(shí)際開發(fā)過程中,如果有滿足此模式的業(yè)務(wù),則可對其進(jìn)行分解,按照訪問者模式的結(jié)構(gòu)進(jìn)行構(gòu)建即可。
顯示結(jié)果小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創(chuàng)不易,給個(gè)關(guān)注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點(diǎn)贊、轉(zhuǎn)發(fā) ?謝謝。
往期推薦
設(shè)計(jì)模式總覽
設(shè)計(jì)模式之簡單工廠
設(shè)計(jì)模式之抽象工廠
設(shè)計(jì)模式之建造者
設(shè)計(jì)模式之原型
設(shè)計(jì)模式之單例
設(shè)計(jì)模式之適配器
設(shè)計(jì)模式之橋接
設(shè)計(jì)模式之組合
設(shè)計(jì)模式之裝飾器
設(shè)計(jì)模式之外觀
設(shè)計(jì)模式之享元
設(shè)計(jì)模式之代理
設(shè)計(jì)模式之責(zé)任鏈
設(shè)計(jì)模式之命令
設(shè)計(jì)模式之迭代器
設(shè)計(jì)模式之中介者
設(shè)計(jì)模式之備忘錄
設(shè)計(jì)模式之觀察者
設(shè)計(jì)模式之狀態(tài)
設(shè)計(jì)模式之策略
設(shè)計(jì)模式之模板方法
總結(jié)
- 上一篇: .NET 6 新特性 —— Random
- 下一篇: .NET 6 新特性 WaitAsync