使用Proxy設計模式來增強類的功能:ToastProxy和DesktopToast的設計關系

使用代理模式來增強類的功能:ToastProxy和DesktopToast

Documentation: v1.0.0 Specified for Version v1.12.0,First Release in 2025/7/12

Documenation belongs to Projects: Charliechen114514/CCIMXDesktop: This is a Simple Desktop with Common Utilities for Embedded Device System using Qt6

前言

? 這個算設計模式的部分,筆者當時正在設計的是如何讓我的Desktop支持擴展的從Protocol Json Buffer轉換到我的Toast可以識別的Meta Info的問題。這也是筆者寫下這篇設計文檔的原因——設計文檔鴿了一個月(之前一直認為這個項目還沒有成型的框架,因此遲遲沒有動筆)

關于Proxy設計模式

? 筆者很早就學習過設計模式,至少接觸過一部分,Proxy,英語好的朋友知道,這是代理的意思。代理大伙都知道代理人,替本人出任做工作的代理人。這里我們說的代理,就是提供一個新的類代理舊的類,當然,如果是完全做一樣的事情,我們沒必要請出Proxy,對吧。那么,Proxy顯然要比原先的類多做一部分工作,在筆者看來,Proxy設計模式是對原對象一次無痛(什么是無痛的?指的是不會改動原有類的任何功能,通過和其他類的協作達到增強原有類可以做的事情)擴展。

? 現在說說筆者遇到的問題,看過筆者DesktopToast源碼的朋友就知道,DesktopToast是一個簡單的通知欄滑動類,實際上,我們最關心也是他最本職的功能是這個:

class DesktopToast : public QWidget {Q_OBJECT
public:/*** @brief Construct a new Desktop Toast object* * @param parent */explicit DesktopToast(QWidget* parent = nullptr);/*** @brief set_message push the toast display into the* toast display sessions* @param message* @note this will make a queue like display.* so, if the toast is currently animating, it will not display the new* messages immediately, but wait until the current message is finished*/void set_message(const QString& message);... // 下面的工作是私有成員,set message就是告訴我們的 toast顯示什么東西,很簡單吧!

? 非常好,但是現在呢,筆者正在抽象一個服務類,簡單的講,就是監聽一個特定的文件夾下的json文件解析滿足ToastMetaProtocol要求格式的json文件,一旦監聽到新的文件,我們就做解析轉換,發送信號交給一個類處理并且做顯示,由于我們使用的是Qt,他是按照信號的方式進行傳遞的,筆者經過權衡考慮,認為設計一個類來作為代表,比堆一大堆函數的串行調用要靠譜(真不敢想后者的可擴展性。。。)

? 經過筆者的一番折騰,現在我們的Server類非常的干凈

/*** @brief The ToastPostServer class* This is a server of toast infomation level*/
class ToastPostServer : public DesktopServerBase {Q_OBJECT
public:ToastPostServer(DesktopToast* toast, const QString& monitoring_path, QObject* parent);private:// 這里就是放Toast嘛?顯然不行!ToastReceiver* receiver;
};

? 其中Receiver類也很簡單,他將監聽到的新的Json file轉化成我規定的ToastMetaProtocol對象,在一次信號發射中攜帶ToastMetaProtocol對象走出去,但是現在問題來了,我們的DesktopToast本身不支持ToastMetaProtocol,而且他是特定于我們桌面系統的一個類,如果我強行修改了DesktopToast類,我之后就沒法在其他地方復用了,這咋辦呢?我也不想繼承,因為我不想對其他冗余的接口占用(雖然也是辦法,但是實際上后面我還會增強關于Toast本身的調用,我還要修改一大堆代碼防止客戶調用父類的Partial的功能亂改一通)。歸根揭底,是因為我們在這里是要求DesktopToast類按照一定的順序和其他相關的類進行協作,本質上不算DesktopProxy對象的工作,我們不能強行算在DesktopToast頭上。

? 這就是下面這個類的功能了:

#ifndef TOASTPROXY_H
#define TOASTPROXY_H
#include "core/server/toast_file_gen_and_receiver/ToastMetaProtocol.h"
class DesktopToast;
class ToastProxy : public QObject {
public:ToastProxy() = delete;explicit ToastProxy(DesktopToast* toast, QObject* parent);
public slots:void process_toastMeta(const ToastMetaProtocol& protocolMeta);private:DesktopToast* toast;
};#endif // TOASTPROXY_H

? ToastProxy作為代理對象,增強(延展)了我們的DesktopToast的功能

  • 接收上層組件(如 ToastReceiver)傳來的 ToastMetaProtocol 對象;
  • 解析并轉化為 DesktopToast 可處理的格式;
  • DesktopToast 發起消息展示;
  • 為未來可能新增的中間處理(如日志、過濾、限流等)提供擴展點。

? 這里的一個具體的增強就體現在process_toastMeta,一方面我們的對象可以接受其他對象對我們DesktopToast的通知,而不是直接溝通增加強耦合,而是去隔一層ToastProxy的轉化功能發給DesktopToast可以聽懂的功能,這樣的話,任何的擴展的協作的功能,都可以直接在ToastProxy上加,絲毫不會影響兩側使用這個類做事情和被要求做的事情的類的任何一點行為。這就是代理模式在這里的一次使用。

? 現在有了這個類,我們的調用鏈看起來就像:

ToastPostServer|v
ToastReceiver  --- (signal: protocolMetaReady) -->  ToastProxy  --- (call) --> DesktopToastv
ToastReceiver  --- (signal: protocolMetaReady) -->  ToastProxy  --- (call) --> DesktopToast

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

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

相關文章

瑞芯微2025開發者大會之見聞

序言本人參加了2025年的瑞芯微開發者大會,在展覽區看到了很多有意思的音視頻產品,下面按照產品類型分類給大家做一下展示。期間并沒有將所有展出物進行拍攝,但是基本已經覆蓋大部分內容。1、RK3566該芯片內置DSP音頻處理器,藍牙5.…

【最新】Java的幾種設計模式詳解及適用業務場景

? 1. 單例模式(Singleton) 定義:確保類只有一個實例,并提供全局訪問點。優點:節省資源、控制訪問。場景:數據庫連接池、日志管理器、配置中心。代碼要點: 構造方法私有靜態變量保存唯一實例公共…

單鏈表的手動實現+相關OJ題

目錄 鏈表的介紹 單鏈表的手動實現 單鏈表的基本框架 打印鏈表: 獲取表長: 頭插法新增節點: 尾插法新增節點: 在指定下標插入: 鏈表的查找 刪除鏈表中第一個出現的key: 刪除鏈表中所有key值 鏈表…

梯度提升之原理

簡介 梯度提升主要是基于數學最值問題 數學描述 目標函數為 obj(θ)∑i1nl(yi,y^i(t))∑k1tw(fk)obj(\theta) \sum_{i1}^n l(y_i, \hat y_i^{(t)}) \sum_{k1}^t w(f_k)obj(θ)i1∑n?l(yi?,y^?i(t)?)k1∑t?w(fk?) 其中ttt表示集成的樹的個數,y^i(t)y^i(t?1)…

[學習] Hilbert變換:從數學原理到物理意義的深度解析與仿真實驗(完整實驗代碼)

Hilbert變換:從數學原理到物理意義的深度解析與仿真實驗 文章目錄Hilbert變換:從數學原理到物理意義的深度解析與仿真實驗一、數學原理二、作用與物理意義1.構造解析信號2.相位移動特性3.應用場景三、仿真實驗實驗1:正弦信號的Hilbert變換實驗…

對話弋途科技:當AI重構汽車大腦,一場車載操作系統的“覺醒年代“開始了

(圖片來源:Pixels)站在未來看歷史,AI汽車剛剛開始。數科星球原創作者丨苑晶編輯丨大兔當特斯拉的自動駕駛仍在全球引發爭議時,中國智能汽車戰場已悄然開啟第二幕。從"四個輪子的大手機"到"移動智能空間…

?機器學習量化交易模型全面剖析報告基于因子庫的機器學習交易模型構建指南

目錄 第一章:機器學習在加密貨幣量化交易中的應用概述 范式轉變:從傳統因子到機器學習驅動的策略 為什么選擇機器學習?機遇、挑戰與核心概念 機遇 挑戰 核心概念 第二章:為機器學習準備您的因子庫 理解量化因子作為機器學…

內容創作智能體:多模態內容生成的完整解決方案

內容創作智能體:多模態內容生成的完整解決方案 🌟 嗨,我是IRpickstars! 🌌 總有一行代碼,能點亮萬千星辰。 🔍 在技術的宇宙中,我愿做永不停歇的探索者。 ? 用代碼丈量世界&…

測試學習之——Pytest Day4

Pytest作為Python中功能強大且易于使用的測試框架,深受開發者喜愛。它不僅提供了簡潔的測試編寫方式,還通過豐富的配置選項、靈活的標記機制和強大的數據驅動能力,極大地提升了測試效率和可維護性。本文將深入探討Pytest的配置意義與層級、常…

【軟件系統架構】系列七:系統性能——路由器性能深入解析

目錄 一、路由器的核心功能 二、路由器性能核心指標 1. 吞吐量(Throughput) 2. 并發連接數(Session Capacity) 3. 每秒連接數(CPS,Connections Per Second) 4. 轉發延遲(Laten…

【數據結構】第一講 —— 概論

【數據結構】第一講 —— 概論 文章目錄【數據結構】第一講 —— 概論1.1 基本概念和常用術語1.2 了解數據結構1. 數據結構2. 數據的邏輯結構3. 數據的物理結構(存儲結構)4. 數據的運算1.3 算法的描述和分析1.3.1 算法的描述1.3.21.1 基本概念和常用術語…

全面解析MySQL(2)——CRUD基礎

1.CreateCreate(創建):添加新數據到數據庫中#基礎語法 insert into table_name (column1,column2,column3, ...) values (value1,value2,value3, ...);1.1 單行全列插入value中值的數量和順序必須和column?致describe demo1; -----------------------------------…

某外企筆試總結——純C語言

這里寫自定義目錄標題一、sizeof 計算(32位環境)二、簡答題三、數據存儲區域與可修改性四、字符串比較輸出及原因五、數組指針運算輸出六、字符串倒序代碼錯誤排查七、下面程序可以把1維數組轉為2維數組,然后調用 printArr2D 打印出數組內容&…

Qt Graphs 模塊擬取代 charts 和 data visualization還有很長的路要走

近期關注 Qt 6.10 的分支進展, 發現了 Qt 6.10 的 charts 和 data visualization (以下簡稱 DV)已經被deprecated, 功能將會合并到 graphs 模塊。如果后面 charts\ DV 被棄用,那算是很大的API變化了。從Qt 6.5 以后開始引入的 gra…

2025牛客暑期多校訓練營2(部分補題)

題目鏈接:牛客競賽_ACM/NOI/CSP/CCPC/ICPC算法編程高難度練習賽_牛客競賽OJ B Bitwise Perfect 思路 考慮到由,那么只有變小的時候對答案的貢獻才能夠減少,從二進制的角度考慮什么時候變小,只有min(x,y)中的最高位1異或之后變…

Nginx的location匹配規則

Nginx的location匹配規則 為什么你的Nginx配置總是不生效? 改了Nginx配置無數次,reload命令執行了幾十遍,瀏覽器訪問時卻依然返回404?運維工程師小張上周就遇到了這個問題:明明配置了location /static/ { root /var/ww…

USB 2.0 vs USB 3.0:全面技術對比與選擇指南

USB 2.0 vs USB 3.0:全面技術對比與選擇指南 引言 在當今數字時代,USB接口已成為連接設備與計算機的最普遍標準之一。從2000年USB 2.0的發布到2008年USB 3.0的問世,USB技術經歷了顯著的演進。本文將深入比較這兩種廣泛使用的USB標準&#xff…

DApp架構設計與開發流程指南

目錄 DApp架構設計與開發流程指南 引言:DApp的核心特性 一、DApp架構設計 1.1 分層架構設計 各層核心組件: 1.2 典型架構模式 1.2.1 全去中心化架構 1.2.2 混合架構(推薦) 二、開發流程 2.1 敏捷開發流程 2.2 詳細開發階段 階段1:需求分析與設計(1-2周) 階段2:智能合約…

Windows下odbc配置連接SQL Server

一、查看SQL Server服務是否啟動打開SQL Server 2022配置管理器查看SQL Server運行狀態,可以設置 啟動或停止服務二、windows下如何配置ODBC數據源1、Windows搜索欄中輸入“ODBC數據源管理器”并選擇“以管理員身份運行”來打開它2、添加新的數據源ODBC數據源管理器…

MySQL—表設計和聚合函數以及正則表達式

文章目錄一、第一范式(原子性)二、第二范式(消除部分依賴)三、第三范式(消除傳遞依賴)四、表設計五、聚合函數六、正則表達式MySQL 的三大范式(1NF、2NF、3NF)是關系型數據庫設計的核…