代理模式(Proxy Pattern)詳解:以延遲加載圖片為例

在日常開發中,是否遇到過以下問題:

“程序啟動時圖片太多,加載太慢!”

“用戶還沒看到圖片就已經開始加載了,性能浪費!”

?

此時,代理模式(Proxy Pattern)便派上了用場。本文將以一個圖形界面中“延遲加載圖片”的經典例子,講解代理模式的核心思想與實際應用。

什么是代理模式?

代理模式為其他對象提供一種代理以控制對這個對象的訪問。常見的幾種代理有:

  • 虛擬代理:根據需要創建開銷大的對象(比如圖片加載)。

  • 保護代理:控制訪問權限。

  • 遠程代理:為不同地址空間的對象提供局部代表。

示例場景:圖片延遲加載

設想你有一個圖形界面需要顯示大量圖片,但你不希望一開始就加載全部資源,而是當用戶真正滑動到該圖片位置時再加載。(延遲加載(Lazy Loading)指的是:等到真正需要某個對象或資源時,才去創建或加載它,從而節省資源或提升啟動速度。)

這就非常適合使用“虛擬代理”來優化性能。

?系統的框圖???????

簡單代碼結構解析

com.Proxy_Pattern
│
├── Image.java        // 抽象主題接口
├── RealImage.java    // 真實主題類
├── ProxyImage.java   // 代理類
└── Test.java         // 客戶端測試類

?抽象接口:Image.java

public interface Image {void display();
}

?定義一個圖片的通用接口,所有圖片類都必須實現該方法。

真實類:RealImage.java

public class RealImage implements Image {private String filename;public RealImage(String filename) {this.filename = filename;loadFromDisk();}private void loadFromDisk() {System.out.println("加載圖片:" + filename);}public void display() {System.out.println("顯示圖片:" + filename);}
}

這個類表示真正的圖片加載邏輯。構造函數中會加載圖片文件,相對開銷較大。

代理類:ProxyImage.java

public class ProxyImage implements Image {private String filename;private RealImage realImage;public ProxyImage(String filename) {this.filename = filename;}public void display() {if (realImage == null) {realImage = new RealImage(filename);  // 延遲加載}realImage.display();}
}

該類是代理對象,延遲創建真正的 RealImage 實例。只有在第一次調用 display() 時,才會觸發真實的圖片加載。

測試代碼:Test.java

public class Test {public static void main(String[] args) {Image image = new ProxyImage("cat.jpg");System.out.println("第一次調用:");image.display();  // 第一次加載并顯示System.out.println("第二次調用:");image.display();  // 直接顯示(無需再加載)}
}

輸出實例

從輸出結果可以看到,圖片只在第一次顯示時被加載,第二次就直接顯示,無需重新加載,達到了“懶加載”的效果。

優勢總結

特點描述
延遲加載圖片只在真正需要時才創建,節省資源
隱藏細節客戶端無需關心加載邏輯,只調用 display() 即可
易擴展可在代理中添加緩存、權限控制、日志記錄等功能

使用場景總結

你可以在以下場景中考慮使用代理模式:

  • 圖像、視頻、音頻的懶加載

  • 遠程調用接口的延遲訪問

  • 安全控制,如保護資源的訪問

  • 對資源訪問進行監控或統計

代理模式提供了一種在不修改原有類的前提下,增強功能的優雅方式。通過引入代理對象,我們實現了圖片的延遲加載,大大提升了程序的性能和響應速度。

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

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

相關文章

C++學習筆記(三十六)——STL之排序算法

一、STL 算法 C的STL&#xff08;Standard Template Library&#xff09; 提供了一組高效、通用的算法&#xff0c;這些算法適用于各種容器&#xff08;如 vector、list、set、map&#xff09;。 這些算法主要位于 <algorithm> 和 <numeric> 頭文件中。 通用性&a…

Java基于SpringBoot的企業車輛管理系統,附源碼+文檔說明

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

el-date-picker時間范圍 賦值報錯問題

問題&#xff1a; 點擊時間范圍組件右邊清除圖標&#xff0c;點擊近6小時會把設置好的時間賦值給時間范圍組件 但是出現報錯 原因&#xff1a; 嘗試對null值進行屬性設置操作&#xff1a;修改一個數組的元素&#xff0c;但此時這個數組是null&#xff0c;而不是預期的數組類型…

STM32 中斷系統深度剖析

在嵌入式系統開發領域&#xff0c;STM32 系列微控制器憑借其強大的性能和豐富的資源被廣泛應用。中斷系統作為 STM32 的關鍵特性之一&#xff0c;能夠極大地提升系統的實時響應能力和多任務處理效率。本文將基于 STM32F4 系列芯片&#xff0c;深入剖析中斷與外設中斷的原理、配…

1.3 本書結構概覽:從理論基礎到實踐案例的系統闡述

本書采用由淺入深、理論聯系實踐的結構設計&#xff0c;旨在為讀者提供一個關于大模型與智能代理(Agent)技術的全面認知框架與實施路徑。全書共分為十章&#xff0c;系統性地覆蓋了從技術基礎到企業落地的完整知識鏈條&#xff0c;現概述如下&#xff1a; 首先&#xff0c;第一…

小白訓練日記——2025/4/22

實驗描述 將GobalM模塊加入到changerEx的stage2中。 下面展示一些內聯片段&#xff1a; model dict(backbonedict(interaction_cfg(None,dict(typeGlobalM, embed_dim128,num_heads32,axial_strategyrow),dict(typeChannelExchange, p1/2),dict(typeChannelExchange, p1/2))…

【上位機——MFC】MFC入門

MFC庫中相關類簡介 CObject MFC類庫中絕大部分類的父類&#xff0c;提供了MFC類庫中一些基本的機制。 對運行時類信息的支持。對動態創建的支持。對序列化的支持。 CWinApp 應用程序類&#xff0c;封裝了應用程序、線程等信息。 CDocument 文檔類&#xff0c;管理數據 F…

代碼隨想錄第三十七天|華為秋季筆試真題230823

刷題小記&#xff1a; 主要偏向扎實編碼基礎的考察&#xff0c;但貌似近些年題目難度有所提高&#xff0c;僅供參考。 卡碼網136.獲取連通的相鄰節點列表&#xff08;卡碼網136.獲取連通的相鄰節點列表&#xff09; 題目分析&#xff1a; 題目描述&#xff1a; 存在N個轉發…

計算機視覺cv2入門之實時手勢檢測

前邊我們已經講解了使用cv2進行圖像預處理以及針對實時視頻流文件的操作方法&#xff0c;這里我們通過實時手勢檢測這一案例來學習和實操一下。 大致思路 根據手勢的種類以及指定手勢圖片數量來構建一個自己的手勢圖片數據集CNN模型訓練手勢圖片數據集使用訓練好的模型進行實時…

Java 安全:如何防止 SQL 注入與 XSS 攻擊?

Java 安全&#xff1a;如何防止 SQL 注入與 XSS 攻擊&#xff1f; 在 Java 開發領域&#xff0c;安全問題至關重要&#xff0c;而 SQL 注入和 XSS 攻擊是兩種常見的安全威脅。本文將深入探討如何有效防止這兩種攻擊&#xff0c;通過詳細代碼實例為您呈現解決方案。 一、SQL 注…

Itext進行PDF的編輯開發

這周寫了一周的需求&#xff0c;是制作一個PDF生成功能&#xff0c;其中用到了Itext來制作PDF的視覺效果。其中一些功能不是很懂&#xff0c;僅作記錄&#xff0c;若要學習請仔細甄別正確與否。 開始之前&#xff0c;我還是想說&#xff0c;這傻福需求怎么想出來的&#xff0c…

android編譯使用共享緩存

注意 服務器端與客戶端系統的版本號需為Ubuntu20.04ccache版本不能低于4.4執行用戶需要為sudo權限服務器端nfs目錄權限必須為nobody:nogroup 一、服務端配置&#xff1a; 在服務器192.168.60.142上配置 NFS 共享 1.安裝 NFS 服務器&#xff1a; 1 sudo apt-get install nfs…

工作中sql總結

sql總結 場景1分組后失敗的成功數據帶入場景2完全性質的一對一匹配場景3虛擬戶的特殊匹配場景4多對多匹配場景5一對一匹配場景6 一對多匹配 場景1分組后失敗的成功數據帶入 現有一批交易表的數據&#xff0c;根據戶名&#xff0c;日期&#xff0c;金額分組&#xff0c;存在TRA…

QML FontDialog:使用FontDialog實現字體選擇功能

目錄 引言相關閱讀FontDialog基本介紹字體屬性 實例演示項目結構代碼實現Main.qmlmain.cpp 代碼解析運行效果 總結 引言 在桌面應用程序開發中&#xff0c;字體選擇是一個常見的需求。Qt Quick提供了FontDialog組件來實現這一功能。本文將介紹如何在Qt Quick應用程序中使用Fon…

MCP(3):在CherryStudio中使用MCPServer

上一文章講述了如何新建一個MCP Server&#xff0c;并在MCP Inspector完成測試。本文講述如何在CherryStudio中進行測試。 Cherry Studio 是一款由 CherryHQ 開發的多模型支持的 AI 桌面助手&#xff0c;兼容 Windows、Linux 和 macOS 系統&#xff0c;旨在為用戶提供更便捷、…

面試題-鏈表(2)

1.合并兩個有序鏈表&#xff1a; 21. 合并兩個有序鏈表 - 力扣&#xff08;LeetCode&#xff09; public ListNode mergeTwoLists(ListNode headA, ListNode headB){ListNode newheadnew ListNode(-1);ListNode curnewhead;while(headA!null&&headB!null){if(headA.va…

微軟Entra新安全功能引發大規模賬戶鎖定事件

誤報觸發大規模鎖定 多家機構的Windows管理員報告稱&#xff0c;微軟Entra ID新推出的"MACE"&#xff08;泄露憑證檢測應用&#xff09;功能在部署過程中產生大量誤報&#xff0c;導致用戶賬戶被大規模鎖定。這些警報和鎖定始于昨夜&#xff0c;部分管理員認為屬于誤…

【MATLAB第117期】#源碼分享 | 基于MATLAB的SSM狀態空間模型多元時間序列預測方法(多輸入單輸出)

【MATLAB第117期】#源碼分享 | 基于MATLAB的SSM狀態空間模型多元時間序列預測方法&#xff08;多輸入單輸出&#xff09; 引言 本文使用狀態空間模型實現失業率遞歸預測&#xff0c;狀態空間模型&#xff08;State Space Model, SSM&#xff09;是一種用于描述動態系統行為的…

谷歌瀏覽器搜索后的頁面總是覆蓋當前頁面

最近將搜索引擎換為谷歌后&#xff0c;發現&#xff0c;每次搜索完的結果頁面總是覆蓋當前頁面&#xff0c;非常不方便&#xff0c;在瀏覽器設置中又找不到類似設置的選項&#xff0c;然后終于在一個博主“如何設置使谷歌瀏覽器打開鏈接自動跳轉到新標簽頁而不是覆蓋當前頁面?…

記錄學習的第三十天

今天終于又開始寫博客了。 還是滑動窗口問題&#xff0c;這段時間不出意外都是這了 上面的思路是我自己做的&#xff0c;但是不知道為什么不行&#xff0c;有沒有大佬能指點一下我。 接下來這道題是進階的。不過我之前的基礎都做的很艱難&#xff0c;道阻且長啊。