Android設計模式之代理模式

一、定義:

? ? ? ? 為其他對象提供一種代理以控制對這個對象的訪問。

二、角色組成:

? ? ? ? Subject抽象主題:聲明真是主題與代理的共同接口方法,可以是一個抽象類或接口。

? ? ? ? RealSubject真實主題:定義了代理表示的真實對象,執行具體的邏輯和方法。

? ? ? ? ProxySubject代理:持有對真實主題的引用,實現接口方法中調用真實主題對應的接口方法。

? ? ? ? Client客戶:使用代理的示例,通過調用代理的方法來實現對真實主題的調用。

三、代理類型:

? ? ? ? 1.靜態代理:手動創建代理類直接持有目標對象的引用。

? ? ? ? 2.動態代理:運行時動態生成代理類,如JDK的動態代理,CGLIB等。

? ? ? ? 3.遠程代理:跨進程通信的代理,如Android的AIDL機制。

四、簡單實現:

靜態代理

? ? ? ? 1.抽象主題

public interface FileLoader {
? ? String readFile(String path);
}
? ? ? ? 2.真實主題

public class RealFileLoader implements FileLoader {
? ? @Override
? ? public String readFile(String path) {
? ? ? ? // 模擬讀取文件內容
? ? ? ? return "File content: " + path;
? ? }
}
? ? ? ? 3.代理

public class FileLoaderProxy implements FileLoader {
? ? private RealFileLoader realFileLoader;
? ? private boolean hasPermission;

? ? public FileLoaderProxy(boolean hasPermission) {
? ? ? ? this.hasPermission = hasPermission;
? ? }

? ? @Override
? ? public String readFile(String path) {
? ? ? ? // 延遲初始化真實對象
? ? ? ? if (realFileLoader == null) {
? ? ? ? ? ? realFileLoader = new RealFileLoader();
? ? ? ? }

? ? ? ? // 權限校驗
? ? ? ? if (!hasPermission) {
? ? ? ? ? ? return "Error: Permission denied!";
? ? ? ? }

? ? ? ? // 調用真實對象方法
? ? ? ? return realFileLoader.readFile(path);
? ? }
}
????????4.客戶端調用

public class Main {
? ? public static void main(String[] args) {
? ? ? ? // 有權限的用戶
? ? ? ? FileLoader proxy1 = new FileLoaderProxy(true);
? ? ? ? System.out.println(proxy1.readFile("/data/test.txt"));?
? ? ? ? // 輸出:File content: /data/test.txt

? ? ? ? // 無權限的用戶
? ? ? ? FileLoader proxy2 = new FileLoaderProxy(false);
? ? ? ? System.out.println(proxy2.readFile("/data/secret.txt"));?
? ? ? ? // 輸出:Error: Permission denied!
? ? }
}


動態代理

? ? ? ? 1.抽象主題

public interface DataService {
? ? void saveData(String data);
? ? void deleteData(String id);
}
? ? ? ? 2.真實主題

public class RealDataService implements DataService {
? ? @Override
? ? public void saveData(String data) {
? ? ? ? System.out.println("Saving data: " + data);
? ? }

? ? @Override
? ? public void deleteData(String id) {
? ? ? ? System.out.println("Deleting data with ID: " + id);
? ? }
}
? ? ? ? 3.動態代理執行

public class LoggingHandler implements InvocationHandler {
? ? private Object target; // 目標對象

? ? public LoggingHandler(Object target) {
? ? ? ? this.target = target;
? ? }

? ? @Override
? ? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
? ? ? ? // 記錄調用日志
? ? ? ? System.out.println("Method called: " + method.getName());
? ? ? ? if (args != null) {
? ? ? ? ? ? System.out.println("Arguments: " + Arrays.toString(args));
? ? ? ? }

? ? ? ? // 調用真實對象方法
? ? ? ? Object result = method.invoke(target, args);

? ? ? ? // 記錄返回結果
? ? ? ? System.out.println("Method completed: " + method.getName());
? ? ? ? return result;
? ? }
}
? ? ? ? 4.生成動態代理調用

public class Main {
? ? public static void main(String[] args) {
? ? ? ? // 創建真實對象
? ? ? ? DataService realService = new RealDataService();

? ? ? ? // 創建動態代理
? ? ? ? DataService proxy = (DataService) Proxy.newProxyInstance(
? ? ? ? ? ? realService.getClass().getClassLoader(),
? ? ? ? ? ? realService.getClass().getInterfaces(),
? ? ? ? ? ? new LoggingHandler(realService)
? ? ? ? );

? ? ? ? // 通過代理調用方法
? ? ? ? proxy.saveData("Hello, Proxy!");
? ? ? ? proxy.deleteData("123");
? ? }
}


五、優缺點

優點:

? ? ? ? 1.控制對象訪問,增強安全性。

? ? ? ? 2.支持延遲加載,優化性能。

? ? ? ? 3.解耦客戶端與目標對象

缺點:

? ? ? ? 1.增加代碼復雜度,需要額外增加代理類。

? ? ? ? 2.動態代理可能降低運行效率。

? ? ? ? 3.遠程代理需要處理網絡或跨進程問題。

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

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

相關文章

國外計算機證書推薦(考證)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)

文章目錄 證書推薦1. 六西格瑪 (6 Sigma)2. 亞馬遜網絡服務 (AWS)3. 美國生產與庫存控制學會 (APICS)4. 內部審計師協會 (IIA)5. 微軟 (Microsoft)6. 甲骨文 (Oracle)7. 項目管理協會 (PMI)8. 紅帽 (Red Hat) 證書推薦 1. 六西格瑪 (6 Sigma) 介紹:六西格瑪是一種…

用mkdocs寫文檔#自動更新github-page

https://wuyisheng.github.io/blog 背景是上一篇博客 使用mkdocs,最后提及可以部署github page。這里說明下怎么自動部署。 當然,這篇博客主要的目的還是提供下github page的鏈接 :) 我是這樣做的: step 1: pip3 i…

QT五 文件系統,QFile,QfileInfo

總覽 QIODevice:所有 I/O 設備類的父類,提供了字節塊讀寫的通用操作以及基本接口;QFileDevice:Qt5新增加的類,提供了有關文件操作的通用實現。QFlie:訪問本地文件或者嵌入資源;QTemporaryFile&a…

EF Core表達式樹

文章目錄 前言一、表達式樹與委托的區別二、動態構建表達式樹示例1示例2示例3高級技巧:表達式合并 三、ExpressionTreeToString安裝方法基本用法支持的格式化風格 四、注意事項總結 前言 在 Entity Framework Core 中,表達式樹(Expression T…

NVM安裝速通使用手冊(Windows版)NVM管理node版本命令手冊 NVM使用手冊

nvm(Node Version Manager)是一個用于管理Node.js版本的命令行工具。通過nvm,你可以在同一臺機器上安裝和切換多個Node.js版本,非常適合開發和測試在不同Node.js版本上運行的應用程序 一、安裝地址 1. 官方下載: &…

vLLM命令行使用方法詳解

vLLM 是一個針對大語言模型(LLMs)優化的高效推理和服務庫。以下是 vLLM 命令行工具的詳細使用方法解析,涵蓋常見場景和參數配置: 一、核心命令行工具 vLLM 提供兩個主要的命令行入口: 啟動 API 服務器 用于部署 HTTP/OpenAI 兼容的 API 服務: python -m vllm.entrypoint…

# 基于 OpenCV 的選擇題自動批改系統實現

在教育領域,選擇題的批改工作通常較為繁瑣且重復性高。為了提高批改效率,我們可以利用計算機視覺技術,通過 OpenCV 實現選擇題的自動批改。本文將詳細介紹如何使用 Python 和 OpenCV 實現一個簡單的選擇題自動批改系統。 1. 項目背景 選擇題…

python黑科技:無痛修改第三方庫源碼

需求不符合 很多時候,我們下載的 第三方庫 是不會有需求不滿足的情況,但也有極少的情況,第三方庫 沒有兼顧到需求,導致開發者無法實現相關功能。 如何通過一些操作將 第三方庫 源碼進行修改,是我們將要遇到的一個難點…

第十三章:優化內存管理_《C++性能優化指南》_notes

優化內存管理 一、內存管理基礎概念二、自定義分配器三、智能指針優化重點知識代碼示例:智能指針性能對比 四、性能優化關鍵點總結多選題設計題答案與詳解多選題答案設計題示例答案(第1題) 一、內存管理基礎概念 重點知識 動態內存分配開銷…

python筆記之函數

函數初探 python在要寫出函數很簡單,通過關鍵字def即可寫出,簡單示例如下 def add(a, b):return ab 以上即可以定義出一個簡單的函數:接收兩個變量a和b,返回a和b相加的結果,當然這么說也不全對,原因就是…

【服務器操作指南 - GPU 使用與文件傳輸】輕松掌握 GPU 狀態查看和服務器文件傳輸技巧

0. 引言 在使用服務器時,高效管理 GPU 和文件傳輸是兩項不可或缺的技能。 本指南旨在幫助您快速掌握服務器環境下的 GPU 使用狀態監測方法,并簡要介紹如何在服務器之間進行文件傳輸操作。 1. 查看服務器上的 gpu 使用狀態 1.1 安裝 gpustat 這條指令…

0330-YYYY-MM-DD格式日期比較大小

最簡單的&#xff08;python&#xff09; from datetime import datetime def compare_time(time1,time2): time1_t datetime.strptime(time1,“%Y-%m-%d”) time2_t datetime.strptime(time2,“%Y-%m-%d”) if time1_t < time2_t: return time1_t elif time1_t > ti…

QFlightInstruments飛行儀表控件庫

QFlightInstruments 是一個開源的飛行儀表控件庫&#xff0c;專為基于 Qt 的應用程序設計。它提供了一系列仿真實飛機儀表的組件&#xff0c;適用于飛行模擬軟件、航空電子系統或任何需要高仿真飛行儀表顯示的項目。 主要功能 高仿真飛行儀表&#xff1a;包括空速表、高度表、…

VSCode 市場發現惡意擴展正在傳播勒索軟件!

在VSCode 市場中發現了兩個隱藏著勒索軟件的惡意擴展。其中一個于去年 10 月出現在微軟商店&#xff0c;但很長時間沒有引起注意。 這些是擴展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已從商店中刪除。 此外&#xff0c;ahban.cychelloworld 擴展于 2024 年 10 月…

國信華源攜AI+水利創新成果亮相第十五屆防汛抗旱信息化技術交流會

直擊展會現場 近日&#xff0c;以“人工智能賦能防汛抗旱 融合創新共御極端災害”為主題的第十五屆防汛抗旱信息化技術交流會在河南鄭州召開。作為水旱災害防御領域的專精企業&#xff0c;北京國信華源科技有限公司攜自主研發的入戶叫應預警系統及覆蓋防汛抗旱全鏈條的智慧化場…

MATLAB語言的鏈表反轉

MATLAB語言的鏈表反轉 鏈表是一種常見的數據結構&#xff0c;與數組相比&#xff0c;鏈表在插入和刪除操作方面具有更高的靈活性。然而&#xff0c;鏈表的一些操作&#xff0c;比如反轉鏈表&#xff0c;對一些初學者來說可能是一個挑戰。本篇文章將重點討論如何使用MATLAB語言…

Oracle數據庫數據編程SQL<2.2 DDL 視圖、序列>

目錄 一、Oracle 視圖(Views) &#xff08;一&#xff09; Oracle 視圖特點 &#xff08;二&#xff09;Oracle 視圖創建語法 關鍵參數&#xff1a; &#xff08;三&#xff09;Oracle 視圖類型 1、普通視圖 2、連接視圖&#xff08;可更新&#xff09; 3、對象視圖 4…

QtAdvancedStylesheets使用

QtAdvancedStylesheets 是一個基于 Qt Widgets 的樣式表(QSS)增強庫,允許開發者通過類似 CSS 的方式深度定制 Qt 應用程序的界面風格,支持動態主題切換、動畫效果和復雜控件樣式設計。 1. 核心功能 高級樣式表支持 使用 CSS-like 語法美化 Qt Widgets(如 QPushButton、Q…

QtAV入門

QtAV 是一個基于 FFmpeg 和 Qt 的高性能多媒體播放框架,提供強大的音視頻解碼、渲染和處理能力,適合開發跨平臺的播放器、視頻編輯和流媒體應用。 1. 核心功能 多格式支持 支持 H.264/H.265、VP9、AV1 等視頻編碼。 支持 MP3、AAC、Opus 等音頻編碼。 封裝格式:MP4、MKV、…

[ C++ ] | C++11 從左值引用到右值引用

&#xff08;目錄占位&#xff09; 1. 前言&#xff1a; C 11 是在 C 98 之后又一個變化比較大的標準。為C增加了很多東西&#xff0c;其中有一部分是有用的&#xff0c;有一部分是我自認為作用不是很大東西。這一章呢&#xff1f;我們就來說說C11我&#xff0c;我認為對性能…