C++八股--5--設計模式--適配器模式,代理模式,觀察者模式


3. 觀察者模式(也叫做觀察者-監聽者模式,發布-訂閱模式)
主要關注對象的一對多關系,也就是多個對象都依賴于一個對象,當該對象狀態改變時,其余對象都能得到對應的通知
如:一組數據(數據對象)->曲線圖,柱狀圖,圓餅圖
主題有更改,應該及時通知相應觀察者去處理相應的事件

class Observer
{
public:
?? ?//處理消息接口
?? ?virtual void handle(int msgid) = 0;
};

class Observer1
{
public:
?? ?//處理消息接口
?? ?void handle(int msgid)
?? ?{
?? ??? ?switch(msgid)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?cout<<"get 1"<<endl;
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?cout<<"get 2"<<endl;
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?cout<<"get error"<<endl;
?? ??? ??? ?break;
?? ??? ?}
?? ?}
};

class Observer2
{
public:
?? ?//處理消息接口
?? ?void handle(int msgid)
?? ?{
?? ??? ?switch(msgid)
?? ??? ?{
?? ??? ?case 2:
?? ??? ??? ?cout<<"get 2"<<endl;
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?cout<<"get error"<<endl;
?? ??? ??? ?break;
?? ??? ?}
?? ?}
};

class Subject
{
public:?? ?
?? ?//添加對應觀察者
?? ?void addObserver(Observer* obser,int msgid)
?? ?{
?? ??? ?_subMap[msgid].push_back(obser);
?? ?}
?? ?//通知觀察者
?? ?void dispatch(int msg)
?? ?{
?? ??? ?auto it = _subMap.find(msgid);
?? ??? ?if(it != _subMap.end())
?? ??? ?{
?? ??? ??? ?for(Observer *pObser:it->second)
?? ??? ??? ?{
?? ??? ??? ??? ?pObser->handle(msgid):
?? ??? ??? ?}
?? ??? ?}
?? ?}
private:
?? ?//前面的int代表消息id,后面表示對其感興趣的觀察者列表
?? ?unordered_map<int,list<Observer*>> _subMap;
};

觀察者模式實際上就是創建一個主題類,然后當有消息來到的時候,主題負責通知各個觀察者,也就是函數調用


4.代理Proxy模式:通過代理類來控制實際對象的訪問權限
客戶 ?助理Proxy ?老板:委托類

//下面為一個案例,將視頻分為Vip和免費,不同身份可以獲取的視頻不同
class VideoSite
{
?? ?virtual void freeMovie() = 0;//免費電影
?? ?virtual void vipMovie() = 0;//vip電影
};
//這個是我們的網站,實現看vip電影和free電影,也就是我們的委托類
class FixBugVideoSite: public Video Site
{
public:
?? ?virtual void freeMovie()
?? ?{
?? ??? ?cout<<"see free"<<endl;
?? ?}
?? ?virtual void vipMovie()
?? ?{
?? ??? ?cout<<"see vip"<<endl;
?? ?}
};

//下面就是我們免費電影的代理
class FreeVideoSiteProxy : public VideoSite
{
public:
?? ?FreeVideoSiteProxy()
?? ?{
?? ??? ?pVideo = new FixBugVideoSite();
?? ?}
?? ?~ FreeVideoSiteProxy()
?? ?{
?? ??? ?delete pVideo;
?? ?}
?? ?
?? ?virtual void freeMovie()?
?? ?{
?? ??? ?pVideo->freeMovie();//通過代理對象的freeMovie,來訪問真正委托類對象的freeMovie
?? ?}
?? ?virtual void vipMovie()?
?? ?{
?? ??? ?cout<<"你沒充錢,不讓你訪問";
?? ?}


private:
?? ?VideoSite *pVideo;
};

實際上上述代理模式的原理在于創建一個代理類,在代理類中定義委托類指針,不同的代理類指行不同的函數
基類指針指向代理類對象,都使用基類指針保證安全

5.適配器模式
讓不兼容的接口可以一起工作
示例
電腦 -> 投影 ->投影儀?
VGA HDMI Typec 有這三種接口
如果VGA的電腦,投影儀也是VGA,那么就不需要轉換
class VGA
{
public:
?? ?virtual void play() = 0;
?? ?string getType() const{return "VGA";}
};

//這個就是支持VGA接口的投影儀
class TV01 : public VGA
{
public:
?? ?void play()
?? ?{
?? ??? ?cout<<"VGA接口"<<endl;
?? ?}
};

//這個就是支持VGA接口的電腦
class Computer : public VGA
{
public:
?? ?void playVedio(VGA *pVGA)
?? ?{
?? ??? ?pVGA->play();
?? ?}
};
//這時候有一批新的投影儀,只支持HDMI接口
class HDMI
{
public:
?? ?virtual void play() = 0;
};
class TV02 : public HDMI
{
public:
?? ?void play()
?? ?{
?? ??? ?cout<<"HDMI接口"<<endl;
?? ?}
};
此時你使用電腦連接新的投影儀,無法連接

換一個電腦:代碼重構
但是實際上很難去重構
方法2:買一個轉換頭,轉換信號:也就是適配器類

class VGAtoHDMI : public VGA
{
public:
?? ?VGAtoHDMI(HDMI *p):phdmi(p){};
?? ?void play()//該方法相當于轉換頭,做信號轉換的
?? ?{
?? ??? ?phdmi->play():
?? ?}
private:
?? ?HDMI *phdmi;
};

這個適配器模式實際上就是重寫了老接口的函數,轉為新接口的函數,就是更換組件


6.裝飾器模式
和代理模式非常接近,主要是增加現有類的功能
?

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

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

相關文章

ArcGIS arcpy代碼工具——根據屬性結構表創建shape圖層

系列文章目錄 ArcGIS arcpy代碼工具——關于工具使用的軟件環境說明 ArcGIS arcpy代碼工具——批量對MXD文件的頁面布局設置修改 ArcGIS arcpy代碼工具——數據驅動工具批量導出MXD文檔并同步導出圖片 ArcGIS arcpy代碼工具——將要素屬性表字段及要素截圖插入word模板 ArcGIS…

機器視覺開發-打開攝像頭

以下是使用Python和OpenCV打開攝像頭的最簡單實現&#xff1a; import cv2# 打開默認攝像頭&#xff08;通常是0&#xff09; cap cv2.VideoCapture(0)# 檢查攝像頭是否成功打開 if not cap.isOpened():print("無法打開攝像頭")exit()print("攝像頭已打開 - 按…

(Go Gin)Gin學習筆記(三)數據解析和綁定:結構體分析,包括JSON解析、form解析、URL解析,區分綁定的Bind方法

1. 數據解析和綁定 bind或bindXXX函數&#xff08;后文中我們統一都叫bind函數&#xff09;的作用就是將請求體中的參數值綁定到對應的結構體上&#xff0c;以方便后續業務邏輯的處理 1.1 JSON數據解析和綁定 客戶端傳參&#xff0c;后端接收并解析到結構體 package mainim…

Kubernetes(k8s)學習筆記(四)--入門基本操作

本文通過kubernetes部署tomcat集群&#xff0c;來學習和掌握kubernetes的一些入門基本操作 前提條件 1.各個節點處于Ready狀態&#xff1b; 2.配置好docker鏡像庫(否則會出現ImagePullBackOff等一些問題)&#xff1b; 3.網絡配置正常(否則即使應用發布沒問題&#xff0c;瀏…

【大模型面試每日一題】Day 7:為什么大模型訓練選擇 Adam 而非 SGD?Adam 的關鍵改進是什么?

【大模型面試每日一題】Day 7&#xff1a;為什么大模型訓練選擇 Adam 而非 SGD&#xff1f;Adam 的關鍵改進是什么&#xff1f; &#x1f4cc; 題目重現 &#x1f31f;&#x1f31f; 面試官&#xff1a;為什么大模型訓練選擇 Adam 而非 SGD&#xff1f;Adam 的關鍵改進是什么…

輕量級在線Excel預覽工具

輕量級在線Excel預覽工具 簡介 在日常工作中&#xff0c;我們經常需要快速查看Excel文件的內容&#xff0c;但不一定總是需要打開完整的Excel軟件。為了解決這個問題&#xff0c;我開發了一個輕量級的在線Excel預覽工具&#xff0c;讓您可以通過瀏覽器快速查看Excel文件內容。…

[Vue]props解耦傳參

在 Vue 中&#xff0c;通過 props 傳遞路由參數&#xff08;即 props 解耦&#xff09;是一種將組件與路由參數解耦的推薦方式。這種方法能顯著提升組件的獨立性、復用性和可維護性。以下是詳細解釋&#xff1a; 一、什么是 props 解耦&#xff1f; props 解耦是指&#xff1a…

Trae 使用心得:從新手到上手

Trae 使用心得&#xff1a;從新手到上手 最近&#xff0c;我開始試用 Trae&#xff0c;一款新興的 AI 開發工具。在使用過程中&#xff0c;我發現它與我之前用過的 Cursor 有些不同&#xff0c;也帶來了一些新的體驗。 初體驗&#xff1a;操作的便利性 一開始&#xff0c;我…

游戲引擎學習第256天:XBox 控制器卡頓和修復 GL Blit 伽瑪問題

回顧并為今天定下基調 今天的主要任務是讓我們的性能分析工具正常工作&#xff0c;因為昨天已經完成了結構性工作。現在&#xff0c;剩下的工作大部分應該是調試和美化。性能分析工具現在應該已經基本可用了。昨天我們在這個方面取得了很大的進展。 接下來&#xff0c;我們將…

PVD中斷檢測掉電

文章目錄 概述配置掉電擦寫注意 概述 STM32 PVD功能具體可以檢測到上電、掉電瞬間&#xff0c;其處理方式有中斷響應及事件響應。掉電設置為上升沿觸發&#xff0c;上電為下降沿觸發 配置 1.開啟PVD中斷并設置其優先級 2.配置響應中斷或事件的閾值電壓 3.配置響應模式 生成…

快速掌握--cursor

Cursor - The AI Code Editor 官網下載安裝 詳細教程&#xff1a;cursor 下載安裝使用&#xff08;保姆教程&#xff09;_cursor下載-CSDN博客 不知道為啥&#xff0c;第一次給我用的是繁體回答 然后改了一下詢問方式 codebase就是告訴ai可以從整個項目中找答案&#xff0…

1993年地級市民國鐵路開通數據(地級市工具變量)

1993年地級市民國鐵路開通數據&#xff08;地級市工具變量&#xff09; 1、時間&#xff1a;1933年 2、指標&#xff1a;是否開通鐵路 3、來源&#xff1a;《Z國鐵道便覽》 4、方法說明&#xff1a;參考田坤&#xff08;2023&#xff09;參考章元&#xff08;2008&#xff…

AI優化SEO關鍵詞實踐路徑

內容概要 隨著人工智能技術深度滲透數字營銷領域&#xff0c;SEO關鍵詞優化正經歷從人工經驗驅動向算法智能決策的躍遷。本文聚焦AI技術在SEO關鍵詞全生命周期管理中的應用框架&#xff0c;系統闡述智能算法如何通過海量數據挖掘潛在搜索需求、解析用戶意圖的語義關聯性&#…

論微服務架構及其應用

試題四 論微服務架構及其應用 微服務提倡將單一應用程序劃分成一組小的服務&#xff0c;服務之間互相協調、互相配合&#xff0c;為用戶提供最終價值。每個服務運行在其獨立的進程中&#xff0c;服務與服務間采用輕量級的通信機制互相溝通。在微服務架構中&#xff0c;每個服務…

基于SpringBoot+Vue實現的電影推薦平臺功能三

一、前言介紹&#xff1a; 1.1 項目摘要 2023年全球流媒體用戶突破15億&#xff0c;用戶面臨海量內容選擇困難&#xff0c;傳統推薦方式存在信息過載、推薦精準度低等問題。傳統推薦系統存在響應延遲高&#xff08;平均>2s&#xff09;。隨著互聯網的快速發展&#xff0c;…

ARM 算數指令

加法 ADD 減法 SUB 取負 NEG 比較 CMP 乘法 MUL 移位 LSL、LSR、ASL、ASR、ROL、ROR加法和減法 絕大多數微處理器都實現了帶進位的加法指令&#xff0c;能夠將兩個操作數和條件碼寄存器中的進位位加到一起。這條指令會使字長大于計算機固有字長的鏈接運算更加方便。 說明了如何…

JAVA---集合ArrayList

集合 1. 自動擴容 &#xff0c;集合長度可變 2. 只可以存引用數據類型&#xff0c;如果要存基本數據類型&#xff0c;需要將其轉換成對應的包裝類 ArrayList 定義在 java.util 下的&#xff0c;實現了 List 接口。ArrayList 內部以動態數組的形式存儲元素&#xff0c;這意…

Scrapy框架之【settings.py文件】詳解

settings.py 文件的主要作用是對 Scrapy 項目的全局設置進行集中管理。借助修改這個文件中的配置項&#xff0c;你可以對爬蟲的行為、性能、數據處理等方面進行靈活調整&#xff0c;而無需修改爬蟲代碼。 ①默認英文注釋settings.py # Scrapy settings for douban project # …

Java變量學習筆記

Java變量 -為什么需要變量&#xff1f; 一個程序就是一個世界 變量是程序的基本組成單位 不論是使用哪種高級程序語言編寫程序,變量都是其程序的基本組成單位&#xff0c;比如: //變量有三個基本要素(類型名稱值) class Test{public static void main(String [largs){int a1;…

數據結構*隊列

隊列 什么是隊列 是一種線性的數據結構&#xff0c;和棧不同&#xff0c;隊列遵循“先進先出”的原則。如下圖所示&#xff1a; 在集合框架中我們可以看到LinkedList類繼承了Queue類&#xff08;隊列&#xff09;。 普通隊列&#xff08;Queue&#xff09; Queue中的方法 …