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