[C++][設計模式][訪問器]詳細講解

目錄

  • 1.動機
  • 2.模式定義
  • 3.要點總結
  • 4.代碼感受
    • 1.代碼一
    • 2.代碼二


1.動機

  • 在軟件構件過程中,由于需求的變化,某些類層次結構中常常需要增加新的行為(方法),如果直接在基類中做這樣的更改, 將會給子類帶來很繁重的變更負擔,甚至破壞原有設計
  • 如何在不更改類層次結構的前提下,在運行時根據需要透明地為類層次結構上的各個類動態添加新的操作,從而避免上面的問題?

2.模式定義

  • 定義:表示一個作用與某對象結構中的各元素的操作
  • 功能:使得可以在不改變(穩定)各元素的類的前提下定義(擴展)作用于這些元素的新操作(變化)
  • 結構
    請添加圖片描述

3.要點總結

  • Visitor模式通過所謂的雙重分發(double dispatch)來實現在不更改(編譯時)Element類層次結構的前提下,在運行時透明地為類層次結構上的各個類動態添加新的操作(支持變化)
  • 所謂雙重分發Visitor模式中間包括了兩個多態分發
    • 第一個為accept方法的多態辨析
    • 第二個為visitElement方法的多態辨析
  • Visitor模式的最大缺點在于擴展類層次結構(添加新的Element子類),會導致Visitor類的改變
    • 因此Visitor模式適用于“Element類層次結構穩定,而其中的操作卻經常面臨頻繁改動”

4.代碼感受

1.代碼一

class Visitor;class Element
{
public:virtual void Func1() = 0;virtual void Func2(int data) = 0;virtual void Func3(int data) = 0;//...virtual ~Element(){}
};class ElementA : public Element
{
public:void Func1() override{}void Func2(int data) override{}
};class ElementB : public Element
{
public:void Func1() override{}void Func2(int data) override {}
};

2.代碼二

class Visitor;class Element
{
public:virtual void accept(Visitor& visitor) = 0; // 第一次多態辨析virtual ~Element(){}
};class ElementA : public Element
{
public:void accept(Visitor& visitor) override {visitor.visitElementA(*this);}
};class ElementB : public Element
{
public:void accept(Visitor& visitor) override {visitor.visitElementB(*this); // 第二次多態辨析}
};class Visitor
{
public:virtual void visitElementA(ElementA& element) = 0;virtual void visitElementB(ElementB& element) = 0;virtual ~Visitor(){}
};//=========================================================
//擴展1
class Visitor1 : public Visitor
{
public:void visitElementA(ElementA& element) override{cout << "Visitor1 is processing ElementA" << endl;}void visitElementB(ElementB& element) override{cout << "Visitor1 is processing ElementB" << endl;}
};//擴展2
class Visitor2 : public Visitor
{
public:void visitElementA(ElementA& element) override{cout << "Visitor2 is processing ElementA" << endl;}void visitElementB(ElementB& element) override{cout << "Visitor2 is processing ElementB" << endl;}
};int main()
{Visitor2 visitor;// 這里應該用一個基類指針接收ElementB elementB;elementB.accept(visitor); // double dispatchElementA elementA;elementA.accept(visitor);return 0;
}

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

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

相關文章

加密基本知識:密鑰、簽名、證書

一、密碼(clpher) 是一種用于加密或者解密的算法 密碼學中的密碼&#xff08;cipher&#xff09;和我們日常生活中所說的密碼不太一樣&#xff0c;計算機術語『密碼 cipher』是一種用于加密或者解密的算法&#xff0c;而我們日常所使用的『密碼 password』是一種口令&#xff…

數據恢復篇:5 款最佳 Mac 數據恢復軟件

說到保護我們的數字生活&#xff0c;數據恢復軟件的重要性怎么強調都不為過。無論您是意外刪除了假期照片的普通用戶&#xff0c;還是面臨硬盤損壞的專業人士&#xff0c;隨之而來的恐慌都是普遍存在的。幸運的是&#xff0c;數據恢復工具可以緩解這些壓力。在Mac用戶可用的眾多…

搜維爾科技:使用Manus VR手套和ART光學追蹤功能實現虛擬場景工業仿真操作

&#xff1a;使用Manus VR手套和ART光學追蹤功能實現虛擬場景工業仿真操作 搜維爾科技&#xff1a;使用Manus VR手套和ART光學追蹤功能實現虛擬場景工業仿真操作

Android C++系列:JNI中的線程操作

Java中創建線程三種方式: 繼承Thread類創建線程類;通過Runnable接口創建線程類;通過Callable和Future創建線程。Native 中支持的線程標準是 POSIX 線程,它定義了一套創建和操作線程的 API 。 我們可以在 Native 代碼中使用 POSIX 線程,就相當于使用一個庫一樣,首先需要包…

android中獲取視頻的預覽圖

1.將視頻導入raw文件中&#xff08;轉為bitmap圖像&#xff09; MediaMetadataRetriever 類主要用于從本地文件或者網絡上的文件獲取元數據信息&#xff0c;例如視頻的幀圖像、持續時間等&#xff0c;并不支持直接從網絡地址獲取視頻幀 MediaMetadataRetriever retriever new…

zabbix小白入門:從SNMP配置到圖形展示——以IBM服務器為例

作者 樂維社區&#xff08;forum.lwops.cn&#xff09;許遠 在運維實踐中&#xff0c;Zabbix作為一款強大的開源監控工具&#xff0c;被廣泛應用于服務器、網絡設備和應用程序的監控&#xff0c;成為保障業務連續性和高效運行的關鍵。然而&#xff0c;對于Zabbix的初學者來說&a…

FactoryBean 原理簡介

FactoryBean 首先是一個工廠類&#xff0c;它可以生產指定的Bean&#xff0c;特殊之處在于它可以向Spring容器中注冊兩個Bean&#xff0c;一個是它本身&#xff0c;一個是FactoryBean.getObject()方法返回值所代表的Bean。通過實現 FactoryBean 接口&#xff0c;你可以控制某個…

線程和進程的區別及應用場景

線程和進程的區別及應用場景 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討計算機中兩個重要的概念&#xff1a;線程和進程。這兩者在操作系…

人工智能--循環神經網絡

個人主頁&#xff1a;歡迎來到 Papicatch的博客 課設專欄 &#xff1a;學生成績管理系統 專業知識專欄&#xff1a; 專業知識 文章目錄 &#x1f349;引言 &#x1f349;概述 &#x1f348;基本概念 &#x1f34d;定義 &#x1f34d;結構 &#x1f34c;輸入層 &#…

行業模板|DataEase旅游行業大屏模板推薦

DataEase開源數據可視化分析工具于2022年6月發布模板市場&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增適用于DataEase v2版本的模板分類。模板市場旨在為DataEase用戶提供專業、美觀、拿來即用的大屏模板&#xff0c;方便用戶根據…

探索編程世界的奇妙之旅

在這個數字化時代&#xff0c;編程&#xff0c;這一曾經看似高深莫測的技能&#xff0c;正逐漸滲透到我們生活的方方面面。從智能手機上的應用程序&#xff0c;到自動駕駛的汽車&#xff0c;再到支撐互聯網運行的龐大服務器集群&#xff0c;背后都離不開編程的力量。今天&#…

【CSharp】使用enum枚舉編程的優點

【CSharp】使用enum枚舉編程的優點 1.背景2.代碼1.背景 在程序開發中為什么會使用enum枚舉呢,其實不使用enum代碼也能跑, 但是隨著業務越來越復雜,年代久遠,那也許就只能你能跑。 所謂面向bug編程,來獲得不可取代地位的思維邏輯,在AI時代洪流面前,從一開始就將錯付。 …

開關電源的電路組成原理

一、 開關電源的電路組成 開關電源的主要電路是由輸入電磁干擾濾波器&#xff08;EMI&#xff09;、整流濾波電路、功率變換電路、PWM控制器電路、輸出整流濾波電路組成。輔助電路有輸入過欠壓保護電路、輸出過欠壓保護電路、輸出過流保護電路、輸出短路保護電路等。 開關電源…

【語音識別】傳統語音識別算法概述,應用場景,項目實踐及案例分析,附帶代碼示例

傳統語音識別算法是將語音信號轉化為文本形式的技術&#xff0c;它主要基于模式識別理論和數學統計學方法。以下是傳統語音識別算法的基本概述&#xff1a; 1. 基本原理 傳統語音識別算法包括以下幾個關鍵步驟&#xff1a; 預處理&#xff1a;將原始語音信號進行采樣、濾波、…

基于Hadoop平臺的電信客服數據的處理與分析④項目實現:任務18: 數據展示

任務描述 接下來我們需要將根據業務需求將某人按照不同維度查詢出來的結果&#xff0c;展示到Web頁面上。 任務指導 數據展示模塊流程圖&#xff1a; 數據展示使用Java的SSM框架&#xff0c;需要實現的代碼包括&#xff1a; 1. 實體類 2. 數據庫操作 3. 業務邏輯操作 4.…

新疆水博會將舉辦多場高端論壇探析水利科技創新發展

由新疆維吾爾自治區水利學會主辦的第三屆新疆國際水利科技博覽會暨新疆水利科技創新發展論壇&#xff0c;將于2024年8月8日至9日在新疆國際會展中心召開&#xff0c;同期將舉辦第三屆新疆國際供排水及智慧水務技術設備展覽會。 據悉&#xff0c;新疆水博會期間將舉辦新疆水利科…

springboot旅游管理系統-計算機畢業設計源碼16021

摘 要 本文旨在設計和實現一個基于Spring Boot框架的旅游管理系統。該系統通過利用Spring Boot的快速開發特性和豐富的生態系統&#xff0c;提供了一個高效、可靠和靈活的解決方案。系統將實現旅游景點信息的管理、線路規劃、跟團游玩、旅游攻略、酒店信息管理、訂單管理和用戶…

MySQL—創建和修改數據表結構

創建表 實例&#xff1a; CREATE TABLE user (id INT,name VARCHAR(255),password VARCHAR(255),birthday DATE) CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB; 顯示數據庫中的表 show tables from hsp; 顯示表結構 desc dept; 修改表 實例&#xff1a; 代碼&…

Rust破界:前端革新與Vite重構的深度透視(中)

Rust破界&#xff1a;前端革新與Vite重構的深度透視 Rust 重構 Vite 的深度剖析技術瓶頸與 Rust 的解法實例分析&#xff1a;性能躍升的實踐 Rust 在前端工具鏈的廣泛影響從 Vite 到更廣闊的舞臺成功案例&#xff1a;其他前端項目的 Rust 實踐技術動因與行業趨勢多樣性思考&…

第十五章 路由器綜合路由配置

實驗目標 掌握綜合路由器的配置方法&#xff1b; 掌握查看通過路由重分布學習產生的路由&#xff1b; 熟悉廣域網線纜的鏈接方式&#xff1b; 實驗背景 假設某公司通過一臺三層交換機連到公司出口路由器 R1 上&#xff0c;路由器 R1 再和公司外的另一臺路由器 R2 連接。…