設計模式——訪問者模式(Visitor)

訪問者模式(Visitor Pattern)是一種將數據操作與數據結構分離的設計模式。這種模式適用于數據結構相對穩定,而操作算法經常改變的情況。訪問者模式將數據結構(穩定的部分)中的元素(Element)的訪問行為(變化的部分)封裝在一個獨立的訪問者(Visitor)類中,使得可以在不修改數據結構的前提下增加新的操作。

訪問者模式包含以下幾個角色:

  1. Visitor(訪問者):接口聲明了一個或多個訪問操作,每個操作對應數據結構中的一種可能元素類型。

  2. ConcreteVisitor(具體訪問者):實現Visitor接口,為每個Element類提供一個訪問操作實現,該操作會執行相應的業務邏輯。

  3. Element(元素):接口或抽象類,定義了一個接受訪問者(accept)的方法,該方法通常以訪問者作為參數。

  4. ConcreteElement(具體元素):實現了Element接口或繼承了Element抽象類,實現了accept()方法,該方法通常調用訪問者的訪問操作并傳入自己作為參數。

  5. ObjectStructure(對象結構):是元素的集合,它可以是組合模式的結構、數組或其他數據結構。它提供一種讓訪問者可以訪問其所有元素的能力,如可以遍歷所有元素并調用元素的accept()方法。

以下是訪問者模式的一個簡單Java代碼示例:

// 訪問者接口
public interface Visitor {void visit(ConcreteElementA element);void visit(ConcreteElementB element);
}// 具體訪問者
public class ConcreteVisitor implements Visitor {@Overridepublic void visit(ConcreteElementA element) {System.out.println("Visiting ConcreteElementA: " + element.operationA());}@Overridepublic void visit(ConcreteElementB element) {System.out.println("Visiting ConcreteElementB: " + element.operationB());}
}// 元素接口
public interface Element {void accept(Visitor visitor);
}// 具體元素A
public class ConcreteElementA implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationA() {return "ConcreteElementA";}
}// 具體元素B
public class ConcreteElementB implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationB() {return "ConcreteElementB";}
}// 對象結構示例(這里使用簡單的集合)
import java.util.ArrayList;
import java.util.List;public class ObjectStructure {private List<Element> elements = new ArrayList<>();public void attach(Element element) {elements.add(element);}public void detach(Element element) {elements.remove(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}// 客戶端代碼
public class Client {public static void main(String[] args) {ObjectStructure os = new ObjectStructure();os.attach(new ConcreteElementA());os.attach(new ConcreteElementB());Visitor visitor = new ConcreteVisitor();os.accept(visitor);}
}

在上面的示例中,ConcreteVisitor實現了Visitor接口,并為每種類型的Element提供了訪問方法。ConcreteElementAConcreteElementB實現了Element接口,并實現了accept方法以接受訪問者。ObjectStructure作為元素的集合,它允許訪問者訪問其所有元素。客戶端代碼創建了ObjectStructure實例,并添加了一些Element實例,然后創建了一個Visitor實例,并讓ObjectStructure接受這個Visitor。這樣,Visitor就能夠訪問所有的Element實例,并執行相應的操作。

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

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

相關文章

C語言題目:一元二次方程

題目描述 解一元二次方程ax^2bxc0的解。 輸入格式 a,b,c的值。 輸出格式 輸出兩個解&#xff0c;按照大小順序輸出&#xff0c;一個解時需要打印兩次&#xff0c;不用考慮無解問題&#xff0c;保留兩位小數 樣例輸入 1 5 -2樣例輸出 0.37 -5.37 代碼解析 首先&#xff0…

了解進程和線程

一、進程和線程 類比&#xff1a; 一個工廠&#xff0c;至少有一個車間&#xff0c;一個車間中至少有一個工人&#xff0c;最終是工人在工作。 一個程序&#xff0c;至少有一個進程&#xff0c;一個進程中至少有一個線程&#xff0c;最終是線程在工作。 進程&#xff1a;是計…

C#正則表達式,提取信息使用

正則表達式簡介 在C#中&#xff0c;正則表達式&#xff08;Regular Expression&#xff0c;通常簡寫為regex或regexp&#xff09;是一種功能強大的文本處理工具&#xff0c;它使用特定的字符序列來定義搜索模式&#xff0c;從而實現對文本的高效搜索、匹配和替換操作。正則表達…

鄉村振興與鄉村旅游深度融合:依托鄉村自然和文化資源,發展鄉村旅游產業,促進農民增收致富,打造特色美麗鄉村

目錄 一、引言 二、鄉村振興與鄉村旅游的內在聯系 三、依托鄉村自然和文化資源發展鄉村旅游產業 &#xff08;一&#xff09;挖掘鄉村自然資源優勢&#xff0c;打造特色旅游品牌 &#xff08;二&#xff09;挖掘鄉村文化資源內涵&#xff0c;豐富旅游活動內容 四、促進農…

新手做視頻號電商,做什么樣的產品好賣?適合不會選類目的新手看

大家好&#xff0c;我是電商花花&#xff0c;專注做電商的花花。 視頻號現在的發展可以說是非常好的&#xff0c;擁有著空前的市場和流量&#xff0c;隨著視頻號小店新項目對電商的沖擊&#xff0c;讓更多創業者和新手商家開始涌入視頻號電商的行列。 想要在新項目中搶占流量…

【客戶案例】禪道軟件助力長虹新網實現研發項目管理創新

四川長虹新網科技有限責任公司&#xff08;以下簡稱長虹新網&#xff09;深耕全球運營商市場二十多年&#xff0c;具備行業領先的軟硬件研發、制造、全球化市場營銷能力&#xff0c;持續服務國內外200多家主流電信及廣電運營商、垂直行業服務商&#xff0c;與合作伙伴共同成長。…

Windows11系統安裝Mysql8之后,啟動服務net start mysql報錯“服務沒有響應控制功能”的解決辦法

問題 系統環境&#xff1a;Windows11 數據庫版本&#xff1a;Mysql8 雙擊安裝&#xff0c;一路下一步&#xff0c;完成&#xff0c;很順利&#xff0c;但是開啟服務后 net start mysql 報錯&#xff1a; 服務沒有響應控制功能。 請鍵入 NET HELPMSG 2186 以獲得更多的幫助 不…

【項目001】運維工程師項目實踐:高可用性云基礎設施部署與升級項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 1、什么是ELK&#xff1f; 2、什么是Elasticsearch、Logstash 和Kibana&#xff1f; 3、ELK 三…

echarts樹圖 改文本顯示的地方的樣式

樹圖改文本顯示的時候的樣式 雖然有點越改越丑 其中有一些失敗的嘗試 forammter 無法識別html元素 所以對于tooptips有用的html元素定義獲取返回在這里寫的話是不生效的 rich配置項里面的backgroundColor官方說支持 html元素和canvas元素 已經圖片url 沒有詳細試驗 官網地址 h…

【chisel】如何用chisel寫一個上升沿檢測程序

自定義上升沿檢測 class RisingEdgeDetector extends Module {val io IO(new Bundle {val inSig Input(Bool())val outSig Output(Bool())val clock Input(Clock())})// 定義 risingedge 函數def risingedge(x: Bool): Bool x && !RegNext(x)// 使用 risingedge …

代碼簽名證書的重要作用及申請途徑

代碼簽名技術是一種確保軟件完整性和來源可信度的安全措施。它通過數字證書和加密算法為軟件代碼或可執行文件加上一個“簽名”&#xff0c;以此驗證軟件未被篡改&#xff0c;并確認其來源于可信賴的開發者。 一、代碼簽名證書的重要作用 1、提高下載率和安裝率&#xff1a;用…

Linux提權--Rsync(未授權訪問) Docker 組掛載

免責聲明:本文僅做技術學習與交流... 目錄 Rsync&#xff08;未授權訪問&#xff09; 介紹: 靶場及過程: 提權過程&#xff1a; Docker 組掛載 原理: 復現&#xff1a; 利用&#xff1a; 具體操作: 1-確定是否有docker服務 2-查看用戶是否在docker組里面 3-執行命…

包管理工具npm、cnpm、yarn、NVM

文章目錄 npmnpm基本使用npm搜索包生產環境與開發環境開發依賴與生產依賴全局安裝環境變量Path安裝包依賴安裝指定版本的包、刪除依賴配置命令別名 cnpm安裝操作命令&#xff1a;配置 yarnyarn安裝及常用命令yarn 配置淘寶鏡像 NVM使用常用命令 擴展內容npm和yarn的選擇npm發布…

USB轉串口芯片CH341、CH372、CH374、CH375等的電路及 PCB 設計的重要注意事項

前言 USB芯片的電路和PCB設計參考及注意事項&#xff0c;含CH34X、CH37X等系列芯片的電路設計說明。涉及工作穩定性和抗干擾以及USB-HOST帶電熱插拔。基于 USB 芯片的電路及 PCB 設計的重要注意事項 版本&#xff1a;2E 1、摘要 本文主要針對以下因電路及 PCB 設計不佳而引起…

文檔解析與向量化技術加速多模態大模型訓練與應用

前言 隨著人工智能技術的不斷發展&#xff0c;多模態大模型作為一種新型的機器學習技術&#xff0c;逐漸成為人工智能領域的熱點話題。多模態大模型能夠處理多種媒體數據&#xff0c;如文本、圖像、音頻和視頻等&#xff0c;并通過學習不同模態之間的關聯&#xff0c;實現更加…

Q1咖啡機行業線上市場(京東天貓淘寶)銷售數據分析

回顧疫情那幾年&#xff0c;咖啡機市場可能是大環境帶動下爆發飛速的品類之一。在整體廚房小家電大盤銷售不佳的情況下&#xff0c; 咖啡機市場的表現是亮眼的。而今年Q1季度&#xff0c;在廚衛小電市場整體低迷的狀態下&#xff0c;咖啡機市場依然保持著穩中向好的趨勢。 根據…

Windows 命令修改時間

Windows 命令修改時間 運行w32tm /resync&#xff0c; 顯示“此計算機沒有重新同步&#xff0c;因為沒有可用的時間數據”&#xff0c; 運行w32tm /query /source &#xff0c; 顯示“Local CMOS Clock”&#xff0c;表示正在使用的是主板上的時間&#xff0c;沒有使用外部…

樹莓派|連接CSI接口攝像頭+opencv

CSI&#xff08;Camera Serial Interface&#xff09;接口攝像頭是一種常見的嵌入式系統或移動設備中使用的攝像頭接口。它通常用于與處理器或圖像傳感器進行直接連接&#xff0c;實現高速的圖像數據傳輸。 CSI接口攝像頭具有以下特點&#xff1a; 高速傳輸&#xff1a;CSI接口…

Spring MVC(五) 文件上傳

1 單文件上傳 在程序開發中&#xff0c;有時候需要上傳一些文件。我們在學習Servlet的時候&#xff0c;也做過文件上傳的操作&#xff0c;只不過基于Servlet的文件上傳操作起來過于復雜&#xff0c;因此所有的MVC框架都提供了自己的文件上傳操作&#xff0c;基本上都是基于File…

UE5 FARFilter篩選器使用方法

UE5 查找資源時可以用FARFilter進行篩選&#xff0c;之前可以用ClassNames進行篩選&#xff0c;但是5.1之后就棄用這個屬性改成ClassPaths屬性 構造一個FTopLevelAssetPath對象需要兩個FName參數&#xff0c;但是沒找到應該傳什么 查找官方文檔&#xff0c;明顯是錯誤的&#x…