深入理解設計模式之訪問者模式

深入理解設計模式之訪問者模式(Visitor Pattern)

一、什么是訪問者模式?

訪問者模式(Visitor Pattern)是一種行為型設計模式。它的主要作用是將數據結構與數據操作分離,使得在不改變數據結構的前提下,能夠為其添加新的操作。

簡單來說,訪問者模式允許你在不修改對象結構的情況下,定義作用于這些對象的新操作。它適用于數據結構相對穩定,但經常需要對結構中的元素進行不同操作的場景。

二、訪問者模式的結構

訪問者模式主要包含以下角色:

  1. Visitor(訪問者):為每一個具體元素聲明一個訪問操作接口。
  2. ConcreteVisitor(具體訪問者):實現每個元素訪問操作。
  3. Element(元素):定義一個接受訪問者的方法(accept)。
  4. ConcreteElement(具體元素):實現accept方法,通常會調用訪問者的visit方法。
  5. ObjectStructure(對象結構):可以遍歷元素,并讓訪問者訪問每一個元素。

三、訪問者模式的優缺點

優點

  • 符合單一職責原則:將數據結構和數據操作分離。
  • 擴展性好:增加新的操作很方便,只需增加新的訪問者即可。
  • 靈活性高:可以對一組對象進行不同的操作,而不改變對象本身。

缺點

  • 元素對象變更困難:如果元素對象結構經常變化,則需要頻繁修改所有訪問者。
  • 破壞封裝:訪問者模式要求訪問元素的內部細節,可能會破壞元素的封裝性。

四、典型應用場景

  • 對一個對象結構中的對象進行很多不同且不相關的操作。
  • 需要對對象結構中的對象進行新的操作,但不希望修改這些對象的類。

五、Java實現示例

1. 元素接口和具體元素

// 元素接口
public interface Element {void accept(Visitor visitor);
}// 具體元素A
public class ConcreteElementA implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public void operationA() {System.out.println("ConcreteElementA operationA");}
}// 具體元素B
public class ConcreteElementB implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public void operationB() {System.out.println("ConcreteElementB operationB");}
}

2. 訪問者接口和具體訪問者

// 訪問者接口
public interface Visitor {void visit(ConcreteElementA elementA);void visit(ConcreteElementB elementB);
}// 具體訪問者1
public class ConcreteVisitor1 implements Visitor {@Overridepublic void visit(ConcreteElementA elementA) {System.out.println("ConcreteVisitor1 訪問了 ConcreteElementA");elementA.operationA();}@Overridepublic void visit(ConcreteElementB elementB) {System.out.println("ConcreteVisitor1 訪問了 ConcreteElementB");elementB.operationB();}
}// 具體訪問者2
public class ConcreteVisitor2 implements Visitor {@Overridepublic void visit(ConcreteElementA elementA) {System.out.println("ConcreteVisitor2 訪問了 ConcreteElementA");}@Overridepublic void visit(ConcreteElementB elementB) {System.out.println("ConcreteVisitor2 訪問了 ConcreteElementB");}
}

3. 對象結構

import java.util.ArrayList;
import java.util.List;public class ObjectStructure {private List<Element> elements = new ArrayList<>();public void addElement(Element element) {elements.add(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}

4. 客戶端測試

public class Client {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure();objectStructure.addElement(new ConcreteElementA());objectStructure.addElement(new ConcreteElementB());Visitor visitor1 = new ConcreteVisitor1();Visitor visitor2 = new ConcreteVisitor2();System.out.println("使用訪問者1:");objectStructure.accept(visitor1);System.out.println("\n使用訪問者2:");objectStructure.accept(visitor2);}
}

5. 輸出結果

使用訪問者1:
ConcreteVisitor1 訪問了 ConcreteElementA
ConcreteElementA operationA
ConcreteVisitor1 訪問了 ConcreteElementB
ConcreteElementB operationB使用訪問者2:
ConcreteVisitor2 訪問了 ConcreteElementA
ConcreteVisitor2 訪問了 ConcreteElementB

六、總結

訪問者模式是一種非常實用的設計模式,尤其適用于“數據結構穩定,操作多變”的場景。它讓你可以在不改變數據結構的前提下,靈活地為結構中的元素添加新的操作。但如果數據結構本身經常變化,則不適合使用訪問者模式。


如需源碼或有其他設計模式問題,歡迎留言交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82003.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82003.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82003.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

div或button一些好看實用的 CSS 樣式示例

1&#xff1a;現代漸變按鈕 .count {width: 800px;background: linear-gradient(135deg, #72EDF2 0%, #5151E5 100%);padding: 12px 24px;border-radius: 10px;box-shadow: 0 4px 15px rgba(81, 81, 229, 0.3);color: white;font-weight: bold;border: none;cursor: pointer;t…

【基于STM32的新能源汽車智能循跡系統開發全解析】

基于STM32的新能源汽車智能循跡系統開發全解析&#xff08;附完整工程代碼&#xff09; 作者聲明 作者&#xff1a; 某新能源車企資深嵌入式工程師&#xff08;專家認證&#xff09; 技術方向&#xff1a; 智能駕駛底層控制 | 車規級嵌入式開發 原創聲明&#xff1a; 本文已申…

HTML Day02

Day02 0. 引言1. 文本格式化1.1 HTML文本格式化標簽1.2 HTML"計算機輸出"標簽1.3 HTML 引文&#xff0c;引用及標簽定義 2. HTML鏈接2.1鏈接跳轉原理&#xff08;有點亂可跳過&#xff09;2.2 HTML超鏈接2.3 target屬性2.4 id屬性2.4.1 id屬性在頁面內和不同頁面的定…

MIT 6.S081 2020 Lab6 Copy-on-Write Fork for xv6 個人全流程

文章目錄 零、寫在前面一、Implement copy-on write1.1 說明1.2 實現1.2.1 延遲復制與釋放1.2.2 寫時復制 零、寫在前面 可以閱讀下 《xv6 book》 的第五章中斷和設備驅動。 問題 在 xv6 中&#xff0c;fork() 系統調用會將父進程的整個用戶空間內存復制到子進程中。**如果父…

xhr、fetch和axios

XMLHttpRequest (XHR) XMLHttpRequest 是最早用于在瀏覽器中進行異步網絡請求的 API。它允許網頁在不刷新整個頁面的情況下與服務器交換數據。 // 創建 XHR 對象 const xhr new XMLHttpRequest();// 初始化請求 xhr.open(GET, https://api.example.com/data, true);// 設置請…

電腦驅動程序更新工具, 3DP Chip 中文綠色版,一鍵更新驅動!

介紹 3DP Chip 是一款免費的驅動程序更新工具&#xff0c;可以幫助用戶快速、方便地識別和更新計算機硬件驅動程序。 驅動程序更新工具下載 https://pan.quark.cn/s/98895d47f57c 軟件截圖 軟件特點 簡單易用&#xff1a;用戶界面簡潔明了&#xff0c;操作方便&#xff0c;…

機器學習與深度學習06-決策樹02

目錄 前文回顧5.決策樹中的熵和信息增益6.什么是基尼不純度7.決策樹與回歸問題8.隨機森林是什么 前文回顧 上一篇文章地址&#xff1a;鏈接 5.決策樹中的熵和信息增益 熵和信息增益是在決策樹中用于特征選擇的重要概念&#xff0c;它們幫助選擇最佳特征進行劃分。 熵&#…

【Kotlin】數字字符串數組集合

【Kotlin】簡介&變量&類&接口 【Kotlin】數字&字符串&數組&集合 文章目錄 Kotlin_數字&字符串&數組&集合數字字面常量顯式轉換數值類型轉換背后發生了什么 運算字符串字符串模板字符串判等修飾符數組集合通過序列提高效率惰性求值序列的操…

oscp練習PG Monster靶機復現

端口掃描 nmap -A -p- -T4 -Pn 192.168.134.180 PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.41 ((Win64) OpenSSL/1.1.1c PHP/7.3.10) |_http-server-header: Apache/2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.3.10 | http-methods:…

近期知識庫開發過程中遇到的一些問題

我們正在使用Rust開發一個知識庫系統&#xff0c;遇到了一些問題&#xff0c;在此記錄備忘。 錯誤&#xff1a;Unable to make method calls because underlying connection is closed 場景&#xff1a;在docker中調用headless_chrome時出錯 原因&#xff1a;為減小鏡像大小&am…

Ubuntu 22.04 系統下 Docker 安裝與配置全指南

Ubuntu 22.04 系統下 Docker 安裝與配置全指南 一、前言 Docker 作為現代開發中不可或缺的容器化工具&#xff0c;能極大提升應用部署和環境管理的效率。本文將詳細介紹在 Ubuntu 22.04 系統上安裝與配置 Docker 的完整流程&#xff0c;包括環境準備、安裝步驟、權限配置及鏡…

C#獲取磁盤容量:代碼實現與應用場景解析

C#獲取磁盤容量&#xff1a;代碼實現與應用場景解析 在軟件開發過程中&#xff0c;尤其是涉及文件存儲、數據備份等功能時&#xff0c;獲取磁盤容量信息是常見的需求。通過獲取磁盤的可用空間和總大小&#xff0c;程序可以更好地進行資源管理、預警提示等操作。在 C# 語言中&a…

2025年- H56-Lc164--200.島嶼數量(圖論,深搜)--Java版

1.題目描述 2.思路 &#xff08;1&#xff09;主函數&#xff0c;存儲圖結構 &#xff08;2&#xff09;主函數&#xff0c;visit數組表示已訪問過的元素 &#xff08;3&#xff09;輔助函數&#xff0c;用遞歸&#xff08;深搜&#xff09;&#xff0c;遍歷以已訪問過的元素&…

詳細到用手撕transformer下半部分

之前我們討論了如何實現 Transformer 的核心多頭注意力機制&#xff0c;那么這期我們來完整地實現整個 Transformer 的編碼器和解碼器。 Transformer 架構最初由 Vaswani 等人在 2017 年的論文《Attention Is All You Need》中提出&#xff0c;專為序列到序列&#xff08;seq2s…

WPF事件處理器+x名稱空間

目錄 ?編輯 一、事件處理器知識點 1. XAML中的事件綁定 2. C#中的事件處理方法 3. 方法簽名解釋 4. 命名規范 工作流程 二、導入引用名稱空間 三、x名稱空間及其常用元素 &#xff08;1&#xff09;x名稱空間的由來和作用 &#xff08;2&#xff09;x名稱空間里都有…

Axure設計案例——科技感漸變線性圖

想讓數據變化趨勢展示告別枯燥乏味&#xff0c;成為吸引觀眾目光的亮點嗎&#xff1f;快來看看這個Axure設計的科技感漸變線性圖案例&#xff01;科技感設計風格憑借炫酷的漸變色彩打破傳統線性圖的單調&#xff0c;營造出一種令人過目難忘的視覺體驗。每一條線條都仿佛是流動的…

Git全流程操作指南

Git全流程操作指南 一、Git 環境配置 1. 安裝 Git Windows&#xff1a;下載 Git for Windows macOS&#xff1a;brew install git Linux&#xff1a; sudo apt-get update && sudo apt-get install git # Debian/Ubuntu sudo yum install git …

AI與軟件工程結合的未來三年發展路徑分析

基于對數字化、制造業、工業、零售業等行業的系統調研&#xff0c;以及微軟、谷歌、阿里、華為等大廠的實踐案例&#xff0c;我們可以預見未來三年AI與軟件工程結合將呈現以下發展路徑和趨勢。 一、技術應用維度 1. AI輔助編程工具全面普及 未來三年&#xff0c;AI輔助編程工…

tiktoken學習

1.tiktoken是OpenAI編寫的進行高效分詞操作的庫文件。 2.操作過程&#xff1a; enc tiktoken.get_encoding("gpt2") train_ids enc.encode_ordinary(train_data) val_ids enc.encode_ordinary(val_data) 以這段代碼為例&#xff0c;get_encoding是創建了一個En…

DeepSeek 賦能文化遺產數字化修復:AI 重構千年文明密碼

目錄 一、引言二、文化遺產數字化修復概述2.1 文化遺產數字化修復的意義2.2 傳統數字化修復方法與局限 三、DeepSeek 技術剖析3.1 DeepSeek 技術原理與核心優勢3.2 相比其他技術的獨特之處 四、DeepSeek 在文化遺產數字化修復中的應用4.1 破損文物的智能修復4.2 文化遺產的虛擬…