設計模式筆記_行為型_訪問者模式

1.?訪問者模式介紹

訪問者模式(Visitor Pattern)是一種行為型設計模式,它允許你在不改變對象結構的前提下,定義作用于這些對象的新操作。訪問者模式將操作的邏輯從對象結構中分離出來,使得你可以在運行時動態地添加新的操作

類比場景:想象一下,你有一個博物館,里面有不同的展品(對象結構):繪畫、雕塑等。當有不同的訪客(訪問者,比如藝術愛好者、學生等)來參觀時,他們可能希望對展品進行不同的處理或觀察(操作)。訪問者模式就像是讓這些訪客帶著自己的需求來參觀博物館,而博物館本身無需改變展品的展示方式。當有新的訪問者要進行新的操作時,只需要新增一個訪問者即可。

結構組成:

  1. Visitor(訪問者接口):定義訪問者可以執行的操作;對每種元素類型都有一個方法。
  2. ConcreteVisitor(具體訪問者):實現Visitor接口,定義每個元素的具體訪問行為。
  3. Element(元素接口):被訪問者接口,定義接受訪問者的方法。
  4. ConcreteElement(具體元素):實現Element接口,具體定義接受訪問者的行為。
  5. Object Structure:包含元素的集合,提供一個可以遍歷這些元素的高層接口,并讓訪問者訪問它們。

優缺點分析:

  • 優點
    • 新增操作方便:可以在不修改對象結構的情況下增加新的操作(通過新增visitor實現)。
    • 符合單一職責原則:將不同的操作分離到不同的訪問者中。
    • 擴展性好:可以很方便地增加新的訪問者。
  • 缺點
    • 對象結構必須穩定:如果對象結構經常改變,維護成本會很高(每個visitor里定義了對所有元素的訪問,如果元素發生改變,需要修改所有visitor)。
    • 具體元素更復雜:每個具體元素都需要實現接受訪問者的方法。
    • 可能導致類爆炸:如果元素和訪問者種類很多,會導致類數量激增。

適用場景:

  • 當對象結構較為穩定,且需要在此結構上定義新的操作時。
  • 當需要對一個對象結構中的對象進行很多不同且不相關的操作時。

2. 代碼演示

場景:學生和藝術愛好者(visitor)去博物館(objectStructure)參觀繪畫和雕像(element),各類人行為不同。

Visitor(訪問者接口):

// Visitor接口:定義一個訪問者可以執行的操作
// 包含了對所有具體元素的訪問方法
public interface Visitor {void visit(Painting painting);void visit(Sculpture sculpture);
}

ConcreteVisitor(具體訪問者):

//具體訪問者: 實現Visitor接口,用于定義某種操作
//藝術愛好者的行為
public class ArtLoverVisitor implements Visitor {@Overridepublic void visit(Painting painting) {System.out.println("ArtLoverVisitor visit painting: " + painting.getName());}@Overridepublic void visit(Sculpture sculpture) {System.out.println("ArtLoverVisitor visit sculpture: " + sculpture.getName());}
}//學生的行為
public class StudentVisitor implements Visitor {@Overridepublic void visit(Painting painting) {System.out.println("StudentVisitor visit painting: " + painting.getName());}@Overridepublic void visit(Sculpture sculpture) {System.out.println("StudentVisitor visit sculpture: " + sculpture.getName());}
}

Element(元素接口)

// Element接口:被訪問對象,定義接受訪問者的接口
public interface Exhibit {void accept(Visitor visitor);
}

ConcreteElement(具體元素):

// 具體元素: 實現Element接口,定義接受訪問者的操作
// 繪畫
public class Painting implements Exhibit {private String name;public Painting(String name) {this.name = name;}public String getName() {return name;}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}//雕像
public class Sculpture implements Exhibit {private String name;public Sculpture(String name) {this.name = name;}public String getName() {return name;}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}

Object Structure:

// ObjectStructure:維護元素對象列表,并提供高層方法來遍歷操作這些對象
public class Museum {private List<Exhibit> exhibits = new ArrayList<>();public void addExhibit(Exhibit exhibit) {exhibits.add(exhibit);}public void showExhibits(Visitor visitor) {for (Exhibit exhibit : exhibits) {exhibit.accept(visitor);}}
}

客戶端:

public class VisitorClientDemo {public static void main(String[] args) {Museum museum = new Museum();museum.addExhibit(new Sculpture("The Thinker"));museum.addExhibit(new Painting("Starry Night"));Visitor visitor1 = new ArtLoverVisitor();museum.showExhibits(visitor1);Visitor visitor2 = new StudentVisitor();museum.showExhibits(visitor2);}
}

對應的類圖:

擴展:

上述示例中,將操作(學生/藝術愛好者的行為) 從對象結構(繪畫/雕塑等展覽)中分離出來了,后續若需添加新的操作(歷史專家的行為),只需要新增對應的visitor(HistorianVisitor) 即可。

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

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

相關文章

數學建模 14 中心對數比變換

用途&#xff1a;是處理成分數據的核心預處理方法&#xff0c;核心目標是解決成分數據的和為常數100% &#xff0c; 導致的維度冗余&#xff0c;非線性相關問題。使得數據滿足傳統的統計/建模方法&#xff1b;舉例子&#xff1a;食品比例中 面粉(50%),糖(30%),水(20%)原理&…

【C語言強化訓練16天】--從基礎到進階的蛻變之旅:Day7

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

污水處理行業的 “智能革命”:邊緣計算網關如何重塑傳統運維模式?

污水處理行業的 “智能革命”&#xff1a;邊緣計算網關如何重塑傳統運維模式&#xff1f;在污水處理這一關乎生態環境與可持續發展的關鍵領域&#xff0c;藍蜂網關正憑借其先進技術與強大功能&#xff0c;發揮著無可替代的重要作用。作為工業級物聯網解決方案的核心組件&#x…

ASP.NET Core 中的多租戶 SaaS 應用程序

介紹隨著軟件即服務 (SaaS) 持續主導技術領域&#xff0c;構建能夠高效地從單一代碼庫服務于多位客戶&#xff08;租戶&#xff09;的應用程序變得至關重要。ASP.NET Core 憑借其模塊化和可擴展的架構&#xff0c;是實現多租戶 SaaS 應用程序的強大框架。本文將指導您了解構建多…

JUC之CompletableFuture【中】

文章目錄四、CompletableFuture基本使用4.1 默認線程池、無返回值4.2 默認線程池、有返回值4.3 自定義線程池、有返回值4.4 CompletableFuture 獲取結果五、對結果進行處理5.1 方法說明5.2 示例5.3 thenApply vs thenApplyAsync5.3.1 核心區別: 執行線程不同5.3.2 thenApply: 同…

環境變量不生效?

目錄 添加環境變量 解決不生效 不生效場景 解決辦法 大家都知道Windows系統對于開發者來說并不友好&#xff0c;尤其是新手&#xff0c;當然這是相比于linux和MacOS相比&#xff0c;因為開發工具、項目腳本等環境配置要為復雜&#xff0c;注意事項也更多一些。而這篇文章將…

小迪安全v2023學習筆記(六十六講)—— Java安全SQL注入SSTISPELXXE

文章目錄前記WEB攻防——第六十六天Java安全&SPEL表達式&SSTI模板注入&XXE&JDBC&MyBatis注入環境搭建Hello-Java-SecJavaSecJava安全 - SQL注入-JDBC&MyBatisJDBC注入原理語句拼接預編譯的錯誤使用JdbcTemplate正則過濾MyBatis注入原理Like注入Order B…

把 AI 變成「圖書館管理員」——基于檢索增強的離線圖書語音導航小盒子

標簽&#xff1a;檢索增強、語音導航、離線 LLM、RAG、ESP32-S3、低功耗、TTS、BLE ---- 1. 背景&#xff1a;讀者找不到書的痛苦 高校圖書館每天 5000 人次&#xff0c;高頻問題&#xff1a; ? “《深度學習》在哪個書架&#xff1f;” ? “有沒有類似《三體》的科幻&…

架構思維:在AI時代為產品“減負”的終極武器——用結構化智慧破解數字化復雜困局

摘要 數字化產品的復雜度飆升已成為企業發展的核心瓶頸。本文基于架構思維的本質&#xff08;元素、連接、演進&#xff09;&#xff0c;結合5A架構體系&#xff08;業務/信息/應用/技術/治理架構&#xff09;&#xff0c;系統闡述如何通過分而治之、共性沉淀、AI賦能三大策略降…

黎陽之光:以數字之力,筑牢流域防洪“智慧防線”

當洪水來襲&#xff0c;每一分精準的預報、每一次及時的預警、每一輪科學的預演、每一套完善的預案&#xff0c;都可能關系到江河安瀾與萬家平安。在水利現代化建設的浪潮中&#xff0c;黎陽之光憑借數字孿生、視頻孿生等核心技術&#xff0c;打造流域防洪“四預”管理平臺&…

transformer模型初理解

模型介紹 在 Transformer 之前&#xff0c;主流的序列模型是 **RNN&#xff08;循環神經網絡&#xff09;** 工作方式類似「逐字閱讀」&#xff1a;處理序列時&#xff0c;必須從第一個詞開始&#xff0c;一個接一個往后算&#xff08;比如翻譯時&#xff0c;先看 “我”&#…

驅動開發系列66 - glCompileShader實現 - GLSL中添加內置函數

一&#xff1a;概述 本文介紹如何為 GLSL 語言中增加一個內置函數&#xff0c;以https://registry.khronos.org/OpenGL/extensions/ARB/ARB_shader_texture_image_samples.txt擴展為例&#xff0c;介紹下添加textureSamples內置函數的過程。

指針的應用學習日記

Git常見的命令&#xff1a;%h 簡化哈希 %an 作者名字 %ar 修訂日期(距今) %ad修訂日期 %s提交說明指針簡介指針(Pointer)是C語言的一個重要知識點&#xff0c;其使用靈活、功能強大&#xff0c;是C語言的靈魂。 指針與底層硬件聯系緊密&#xff0c;使用指針可操作數據的地址&am…

KMM跨平臺叛逃實錄:SwiftUI與Compose Multiplatform共享ViewModel的混合開發框架(代碼復用率85%)

KMM跨平臺叛逃實錄&#xff1a;SwiftUI與Compose Multiplatform共享ViewModel的混合開發框架&#xff08;代碼復用率85%&#xff09;一、架構革命&#xff1a;跨平臺統一狀態管理1.1 核心架構設計1.2 技術矩陣對比二、KMM共享ViewModel實現2.1 基礎狀態管理2.2 ViewModel核心架…

關于Android webview協議混淆

背景&#xff1a;android中引入的html頁面是http請求(web服務僅開放了80端口)&#xff0c;但html頁面引用的后端接口是https請求&#xff0c;則發生android中html頁面請求接口異常<請求無法發送到后端服務(status0)>。瀏覽器出于安全考慮&#xff0c;要求&#xff1a; 同…

Android Jetpack | Lifecycle

一.前言 本篇主線包含三點&#xff0c;Lifecycle的作用、簡單使用、核心原理&#xff08;包含核心類與源碼主線分析&#xff09;&#xff1b; 二.作用 官方文檔生命周期感知型組件可執行操作來響應另一個組件&#xff08;如 Activity 和 Fragment&#xff09;的生命周期狀態…

單片機編程架構

沒有最好的程序架構。 只要在項目中實現產品功能并穩定工作&#xff0c;且能在團隊內統一應用管理就是最優的程序架構。 一、單片機運行模型&#xff1a; 1.能分配時間的裸機代碼 2.FreeRTOS操作系統 代碼分層框架&#xff1a; 1.與板關聯的底層 2.《驅動底層的驅動層》《中間層…

114. 二叉樹展開為鏈表

題目&#xff1a;給你二叉樹的根結點 root &#xff0c;請你將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該同樣使用 TreeNode &#xff0c;其中 right 子指針指向鏈表中下一個結點&#xff0c;而左子指針始終為 null 。展開后的單鏈表應該與二叉樹 先序遍歷 順序相同。…

【Langchain系列三】GraphGPT——LangChain+NebulaGraph+llm構建智能圖數據庫問答系統

Langchain二次開發專欄 【Langchain系列一】常用大模型的key獲取與連接方式 【Langchain系列二】LangChain+Prompt +LLM智能問答入門 【Langchain系列三】GraphGPT——LangChain+NebulaGraph+llm構建智能圖數據庫問答系統 【Langchain系列四】RAG——基于非結構化數據庫的智能問…

【GNSS定位原理及算法雜記6】??????PPP(精密單點定位)原理,RTK/PPK/PPP區別討論

PPP 技術詳解&#xff1a;原理、流程與 RTK/PPK 對比 在高精度 GNSS 定位技術體系中&#xff0c;除了 RTK 和 PPK 以外&#xff0c;還有一類無需基站即可實現分米到厘米級定位的方法 —— PPP&#xff08;Precise Point Positioning&#xff0c;精密單點定位&#xff09;。它以…