(三)行為模式:12、訪問者模式(Visitor Pattern)(C++示例)

目錄

1、訪問者模式含義

2、訪問者模式的UML圖學習

3、訪問者模式的應用場景

4、訪問者模式的優缺點

5、訪問者模式C++實現的實例


1、訪問者模式含義

????????訪問者模式(Visitor Pattern)是一種行為型設計模式,它允許將一個作用于某對象結構中的各元素的操作分離出來,封裝成獨立的類,使其在不改變數據結構的前提下可以添加作用于這些元素的新的操作,為數據結構中的每個元素提供多種訪問方式。

????????該模式的核心思想是操作分離,通過定義一個外部訪問者類來擴展復雜對象結構的功能,將數據結構與數據操作解耦,使得操作可以獨立于對象的類來定義。

2、訪問者模式的UML圖學習

訪問者模式的UML類圖通常包含以下角色:

(1)抽象訪問者(Visitor):聲明了一個或者多個訪問操作,形成所有的具體元素角色必須實現的接口。

(2)具體訪問者(ConcreteVisitor):實現抽象訪問者角色所聲明的接口,也就是抽象訪問者所聲明的各個訪問操作。

(3)抽象節點(Element):聲明一個接受操作,接受一個訪問者對象作為一個參量。

(4)具體節點(ConcreteNode):實現了抽象節點所規定的接受操作。

(5)結構對象(ObjectStructure):可以遍歷結構中的所有元素;如果需要,提供一個高層次的接口讓訪問者對象可以訪問每一個元素;如果需要,可以設計成一個復合對象或者一個聚集,如列(List)或集合(Set)。

3、訪問者模式的應用場景

(1)數據結構穩定的場景:數據結構(如對象結構)相對穩定,但經常需要對其上的元素執行不同的操作時,訪問者模式非常有用。

(2)需要多種不同操作而不希望修改元素類的場景:如果你有多個不同的操作需要應用到同一組元素上,且不希望在元素類中添加這些操作,訪問者模式可以提供一種解決方案。

(3)需要跨不同類層次結構進行操作的場景:當需要在多個不相關的類層次結構上執行操作時,訪問者模式可以將操作與類層次結構分離。

(4)需要在對象結構中執行復雜計算的場景:訪問者模式可以用于在對象結構中執行復雜的計算或邏輯,而不需要修改元素類本身。

4、訪問者模式的優缺點

(1)優點:

  • 符合單一職責原則:訪問者模式將元素操作封裝在訪問者類中,使得元素類專注于其核心職責,而不需要關心如何處理不同的操作。
  • 優秀的擴展性:通過添加新的訪問者類,可以很容易地擴展對象結構的功能,而不需要修改元素類。
  • 聚合關系:訪問者模式使得元素和訪問者之間形成了一種聚合關系,從而提高了系統的靈活性和可維護性。
  • 具體元素變更不頻繁:如果元素類比較穩定,即不易發生變更,那么訪問者模式將非常適用。

(2)缺點

  • 增加具體元素和訪問者類的難度:每次在元素結構中增加新的元素類時,都需要修改訪問者類,這違反了開閉原則。
  • 破壞封裝:訪問者模式需要訪問元素類的內部數據和方法,這可能會破壞元素的封裝性。
  • 具體元素變更困難:如果元素類經常發生變更,那么訪問者模式將變得難以維護,因為每次變更都需要修改訪問者類。

5、訪問者模式C++實現的實例

#include <iostream>
#include <vector>// 元素接口
class Element {
public:virtual void accept(class Visitor* visitor) = 0;virtual ~Element() {}
};// 具體元素A
class ConcreteElementA : public Element {
public:void accept(Visitor* visitor) override {visitor->visitConcreteElementA(this);}void operationA() {std::cout << "ConcreteElementA's operationA" << std::endl;}
};// 具體元素B
class ConcreteElementB : public Element {
public:void accept(Visitor* visitor) override {visitor->visitConcreteElementB(this);}void operationB() {std::cout << "ConcreteElementB's operationB" << std::endl;}
};// 訪問者接口
class Visitor {
public:virtual void visitConcreteElementA(ConcreteElementA* element) = 0;virtual void visitConcreteElementB(ConcreteElementB* element) = 0;virtual ~Visitor() {}
};// 具體訪問者
class ConcreteVisitor : public Visitor {
public:void visitConcreteElementA(ConcreteElementA* element) override {std::cout << "ConcreteVisitor visiting ConcreteElementA" << std::endl;element->operationA();}void visitConcreteElementB(ConcreteElementB* element) override {std::cout << "ConcreteVisitor visiting ConcreteElementB" << std::endl;element->operationB();}
};// 對象結構
class ObjectStructure {
private:std::vector<Element*> elements;
public:void addElement(Element* element) {elements.push_back(element);}void accept(Visitor* visitor) {for (Element* element : elements) {element->accept(visitor);}}
};int main() {ObjectStructure os;os.addElement(new ConcreteElementA());os.addElement(new ConcreteElementB());ConcreteVisitor visitor;os.accept(&visitor);// 清理內存(在實際應用中,應使用智能指針等機制來管理內存)// 這里為了簡單起見,沒有包含清理代碼return 0;
}

在這個實例中,Element?是元素接口,ConcreteElementA?和?ConcreteElementB?是具體元素類。Visitor?是訪問者接口,ConcreteVisitor?是具體訪問者類。ObjectStructure?是對象結構,它包含多個元素,并允許訪問者訪問這些元素。在?main?函數中,我們創建了一個對象結構,添加了一些元素,并使用訪問者來訪問這些元素。

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

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

相關文章

windows安卓子系統wsa隱藏應用列表的安裝激活使用

Windows 11 安卓子系統應用部署全攻略 windows安卓子系統wsa隱藏應用列表的安裝激活使用|過檢測核心前端 在 Windows 11 系統中&#xff0c;安卓子系統為用戶帶來了在電腦上運行安卓應用的便利。經過一系列的操作&#xff0c;我們已經完成了 Windows 11 安卓子系統的底層和前端…

Elasticsearch 集群搭建

一、集群規劃 1.1 節點角色規劃 節點類型配置要求推薦數量Master節點低磁盤、中等CPU/內存3&#xff08;奇數防止腦裂&#xff09;Data節點高磁盤、高內存、多核CPU根據數據量擴展Coordinating節點高CPU/內存、低磁盤2&#xff08;可選&#xff09; 1.2 硬件建議 內存&…

React 響應事件

開發環境&#xff1a;Reacttsantd 使用 React 可以在 JSX 中添加 事件處理函數。其中事件處理函數為自定義函數&#xff0c;它將在響應交互&#xff08;如點擊、懸停、表單輸入框獲得焦點等&#xff09;時觸發。 學習內容 1.編寫事件處理函數的不同方法 2.如何從父組件傳遞事件…

SQL基礎入門:從CRUD到JOIN再到索引(通俗易懂版)

一、為什么需要SQL&#xff1f; 想象你在管理一個圖書館&#xff1a; 傳統方法&#xff1a;手動記錄每本書的位置、借閱者、歸還日期SQL方法&#xff1a;用數據庫系統自動管理&#xff0c;快速查詢《Java編程思想》在哪個書架 SQL&#xff08;Structured Query Language&…

MINIQMT學習課程Day11

現在開始進行策略的交易買賣分析&#xff1a; 還是之前的步驟&#xff0c;打開qmt&#xff0c;選擇獨立交易&#xff0c; 之后使用pycharm&#xff0c;編寫py文件 導入包&#xff1a; import time, datetime, traceback, sys from xtquant import xtdata from xtquant.xttr…

# 實時人臉性別與年齡識別:基于OpenCV與深度學習模型的實現

實時人臉性別與年齡識別&#xff1a;基于OpenCV與深度學習模型的實現 在當今數字化時代&#xff0c;計算機視覺技術正以前所未有的速度改變著我們的生活與工作方式。其中&#xff0c;人臉檢測與分析作為計算機視覺領域的重要分支&#xff0c;已廣泛應用于安防監控、智能交互、…

Python Cookbook-5.14 給字典類型增加排名功能

任務 你需要用字典存儲一些鍵和“分數”的映射關系。你經常需要以自然順序(即以分數的升序)訪問鍵和分數值&#xff0c;并能夠根據那個順序檢查一個鍵的排名。對這個問題&#xff0c;用dict 似乎不太合適。 解決方案 我們可以使用 dict 的子類&#xff0c;根據需要增加或者重…

十四種邏輯器件綜合對比——《器件手冊--邏輯器件》

目錄 邏輯器件 簡述 按功能分類 按工藝分類 按電平分類 特殊功能邏輯器件 應用領域 詳盡闡述 1 邏輯門 一、基本概念 二、主要類型 三、實現方式 四、應用領域 2 反相器 工作原理 基本功能 主要應用 常見類型 特點 未來發展趨勢 3 鎖存器 基本概念 工作原理 主要類型…

如何更改wsl2中的ubuntu默認安裝位置

先前的一篇文章提到了如何更改wsl里面ubuntu的home目錄&#xff0c;wsl裝ubuntu的home目錄在哪&#xff0c;如何更改home&#xff1f;_wsl安裝的ubuntu在哪里-CSDN博客 這次是要更改wsl中ubuntu的安裝目錄&#xff0c;畢竟默認安裝到c盤下會占用不少空間的。 從微軟商店get后…

最近在工作中感受到了設計模式的重要性

之前了解設計模式&#xff1a;只是應付一下面試 在之前一年多的工作中也沒遇到使用場景 最近在搭建驗證環境的時候&#xff0c;才發現這玩意這么重要 首先是設計模式的使用場景一定是在很復雜繁瑣的場景下進行的 之所以說是復雜/繁瑣的場景&#xff0c;因為一些場景也許邏輯不難…

Python深度學習基礎——卷積神經網絡(CNN)(PyTorch)

CNN原理 從DNN到CNN 卷積層與匯聚 深度神經網絡DNN中&#xff0c;相鄰層的所有神經元之間都有連接&#xff0c;這叫全連接&#xff1b;卷積神經網絡 CNN 中&#xff0c;新增了卷積層&#xff08;Convolution&#xff09;與匯聚&#xff08;Pooling&#xff09;。DNN 的全連接…

Linux 第三講 --- 基礎指令(三)

前言&#xff1a; 在前面我們已經講了有十幾個Linux的基礎指令&#xff0c;今天我們再補充幾個常用的基礎指令&#xff0c;為后面的學習做準備 。 目錄 前言&#xff1a; 一、兩個與時間相關的指令 1.date指令 演示 &#xff1a; 時間戳 設置時間 2、cal指令 演示&#x…

基于SiamFC的紅外目標跟蹤

基于SiamFC的紅外目標跟蹤 1,背景與原理2,SiamFC跟蹤方法概述2.1 核心思想2.2 算法優勢3,基于SiamFC的紅外跟蹤代碼詳解3.1 網絡定義與交叉相關模塊3.2 SiamFC 跟蹤器實現3.3 主程序:利用 OpenCV 實現視頻跟蹤4,總結與展望在紅外監控、無人機防御以及低光照場景中,紅外圖…

Odoo 部署本地 把現時的excel計算表格部署上odoo 教程

要將現有的 Excel 計算表格部署到 Odoo 平臺上&#xff0c;您可以按照以下步驟進行操作&#xff1a; 將 Excel 表格中的數據轉移到 Odoo 模塊中&#xff1a;首先&#xff0c;您需要將 Excel 表格中的數據導出為 CSV 格式&#xff0c;然后可以使用 Odoo 的數據導入功能將這些數據…

KWDB創作者計劃—KWDB認知引擎:數據流動架構與時空感知計算的范式突破

引言&#xff1a;數據智能的第三范式 在數字化轉型進入深水區的2025年&#xff0c;企業數據系統正面臨三重悖論&#xff1a;數據規模指數級增長與實時決策需求之間的矛盾、多模態數據孤島與業務連續性要求之間的沖突、靜態存儲范式與動態場景適配之間的鴻溝。KWDB&#xff08;K…

C語言 數據結構 【棧】動態模擬實現

引言 動態模擬實現棧的各個接口 一、棧的概念與結構 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂&#xff0c;另一端稱為棧底。棧中的數據元素遵守后進先出LIFO&#xff08;LastInFirstOut…

Python itertools模塊的groupby函數介紹

itertools.groupby 是 Python 標準庫 itertools 模塊中的一個函數&#xff0c;它的主要功能是對可迭代對象中相鄰的相同元素進行分組。 itertools.groupby(iterable, keyNone) 函數 作用&#xff1a; 將連續的&#xff08;相鄰的&#xff09;相同元素分組&#xff0c;返回 (…

Python實例題:使用Python生成分形圖片

目錄 Python實例題 題目 題目分析 需求理解 關鍵知識點 實現思路分析 代碼實現 代碼解釋 mandelbrot 函數&#xff1a; 設置復平面區域和圖像參數&#xff1a; 計算分形數據&#xff1a; 繪圖展示&#xff1a; 運行思路 Python實例題 題目 使用Python生成分形圖…

系統編程1(進程的概念與原理)

進程的概念與原理 計算機組成部分一般遵循馮諾依曼結構&#xff0c;也就是由控制器、運算器、存儲器、輸入設備、輸出設備五個部分組成。 ? 程序的編譯 一般在編寫出程序之后&#xff0c;并不能直接運行&#xff0c;而是需要把程序通過編譯器進行編譯&#xff0c;生成可執行…

《Vue Router實戰教程》5.嵌套路由

歡迎觀看《Vue Router 實戰&#xff08;第4版&#xff09;》視頻課程 嵌套路由 一些應用程序的 UI 由多層嵌套的組件組成。在這種情況下&#xff0c;URL 的片段通常對應于特定的嵌套組件結構&#xff0c;例如&#xff1a; 通過 Vue Router&#xff0c;你可以使用嵌套路由配置…