【設計模式】代理模式(結構型)???

文章目錄

  • 1.概念
    • 1.1 什么是代理模式
    • 1.2 優點與缺點
  • 2.實現方式
    • 2.1 靜態代理
    • 2.2 動態代理
  • 3. Java 哪些地方用到了代理模式
  • 4. Spring 哪些地方用到了代理模式

1.概念

1.1 什么是代理模式

代理模式(Proxy Pattern)是一種結構型設計模式,它允許通過一個代理對象來控制對另一個對象的訪問。

1.2 優點與缺點

優點:
1.可以控制對真實對象的訪問。
2.可以延遲真實對象的創建,減少系統開銷。
3.可以提供額外的服務,如緩存、權限檢查等。
缺點:
1.增加了系統的復雜性,因為引入了額外的代理類。
2.可能會降低系統的性能,因為代理會增加一層間接調用。

2.實現方式

2.1 靜態代理

// Image接口
public interface Image {void display();
}// RealImage類,實現了Image接口
public class RealImage implements Image {private String fileName;// 構造函數,加載圖像public RealImage(String fileName) {this.fileName = fileName;loadImageFromDisk();}// 加載圖像的模擬方法private void loadImageFromDisk() {System.out.println("Loading  " + fileName);}// 顯示圖像@Overridepublic void display() {System.out.println("Displaying " + fileName);}
}// Image代理類
public class ImageProxy implements Image {private String fileName;private Image realImage;// 構造函數public ImageProxy(String fileName) {this.fileName = fileName;}// 顯示圖像,如果真實圖像尚未加載,則先加載@Overridepublic void display() {if (realImage == null) {realImage = new RealImage(fileName);}realImage.display();}
}// 測試類
public class ProxyPatternDemo {public static void main(String[] args) {Image image = new ImageProxy("test_10mb.jpg");// 圖像將從磁盤加載image.display();System.out.println("");// 圖像不需要從磁盤加載image.display();}
}

2.2 動態代理

動態代理通常使用java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口來實現。

// Image接口
public interface Image {void display();
}// RealImage類,實現了Image接口
public class RealImage implements Image {private String fileName;// 構造函數,加載圖像public RealImage(String fileName) {this.fileName = fileName;loadImageFromDisk();}// 加載圖像的模擬方法private void loadImageFromDisk() {System.out.println("Loading  " + fileName);}// 顯示圖像@Overridepublic void display() {System.out.println("Displaying " + fileName);}
}// 動態代理類
public class DynamicImageProxy {public static Image newInstance(String fileName) {return (Image) java.lang.reflect.Proxy.newProxyInstance(Image.class.getClassLoader(),new Class[]{Image.class},new java.lang.reflect.InvocationHandler() {private Image realImage = null;@Overridepublic Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws Throwable {if (realImage == null) {realImage = new RealImage(fileName);}return method.invoke(realImage, args);}});}
}// 測試類
public class ProxyPatternDemo {public static void main(String[] args) {Image image = DynamicImageProxy.newInstance("test_10mb.jpg");// 圖像將從磁盤加載image.display();System.out.println("");// 圖像不需要從磁盤加載image.display();}
}

3. Java 哪些地方用到了代理模式

RMI(Remote Method Invocation): Java的RMI機制使用代理模式來實現遠程對象的透明訪問。RMI系統提供的代理類將遠程方法調用轉換為對遠程對象的調用。
JDBC(Java Database Connectivity): JDBC驅動程序管理器使用代理模式來加載和實例化JDBC驅動程序。當應用程序請求連接到數據庫時,代理會加載適當的驅動程序并建立連接。
動態代理: Java的動態代理機制允許在運行時創建代理類和代理實例。這通常用于AOP(面向切面編程)框架,如Spring AOP,其中代理用于在目標對象的方法調用前后執行增強代碼。
事件監聽器: 在Swing或其他GUI框架中,事件監聽器使用代理模式來處理事件。事件源將事件委托給事件監聽器,后者作為事件處理的代理。
延遲加載: 在Hibernate或其他ORM框架中,代理模式用于實現延遲加載。代理對象代表真實對象,并在真正需要訪問對象數據時才加載數據。
保護代理: 在需要控制對資源的訪問時,可以使用保護代理來檢查調用者的權限,并根據權限決定是否允許訪問資源。
智能引用: 在需要跟蹤對象的使用情況時,可以使用智能代理來記錄對象的使用次數、最后使用時間等信息。

4. Spring 哪些地方用到了代理模式

AOP(面向切面編程): Spring AOP使用代理模式來實現方法攔截。Spring的AopProxy類充當代理,它根據配置創建代理對象,并在目標對象的方法調用前后執行增強代碼。
事務管理: Spring的事務管理器使用代理模式來管理事務。TransactionInterceptor類充當代理,它在目標方法執行前后管理事務的開啟、提交或回滾。
事件發布: Spring的事件驅動模型使用代理模式來解耦事件的生產者和消費者。ApplicationEventMulticaster類充當代理,它將事件發布給所有注冊的監聽器。
Web集成: Spring的Web模塊使用代理模式來集成不同的Web框架。例如,DispatcherServlet充當代理,它將HTTP請求轉換為Spring MVC框架的調用。
資源訪問: Spring的ResourceLoader和Resource接口使用代理模式來抽象不同類型的資源訪問。ResourceLoader的實現類充當代理,它們將資源訪問的調用轉換為具體文件系統、類路徑或URL的訪問。
消息服務: Spring的JMS(Java消息服務)集成使用代理模式來適配不同的消息中間件。JmsTemplate和JmsListenerContainerFactory類充當代理,它們將Spring的消息抽象轉換為具體的消息中間件操作。

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

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

相關文章

帶你認識ffmpeg

FFmpeg是一個開源的跨平臺音視頻處理工具集,它提供了豐富的音視頻處理功能和庫,被廣泛應用于音視頻編解碼、格式轉換、流媒體處理等領域。 應用場景: 視頻編解碼:FFmpeg可以對各種視頻格式進行編解碼,包括但不限于AV…

類的特殊成員函數

使用類的嵌套&#xff0c;并自定義析構函數 #include <iostream>using namespace std; class Per{ private:string name;int age;double hight;double weight; public:Per(string name,int age,double hight,double weight):name(name),age(age),hight(hight),weight(we…

圖片如何修改尺寸?四種好用的修改圖片尺寸方法!

圖片如何修改尺寸&#xff1f;圖片是一種常見的文件類型&#xff0c;它存在于什么生活的方方面面&#xff0c;雖然圖片很好用&#xff0c;但是大家日常也要注意圖片的尺寸&#xff0c;如果圖片尺寸不對是會帶來很多問題的&#xff0c;下面小編就舉例說明幾個問題&#xff0c;首…

web 前端技術的一些知識點分享~

css的規則是由選擇器和 組成的 目錄 css的規則是由選擇器和 組成的 CSS&#xff08;層疊樣式表&#xff09;的規則是由選擇器和聲明塊組成的。 選擇器用于選定頁面上的元素&#xff0c;這可以是一個元素標簽&#xff08;如 h1&#xff09;、類&#xff08;如 .classname…

Unity 自定義房間布局系統 設計與實現一個靈活的房間放置系統 ——物體占用的區域及放置點自動化

放置物體功能 效果&#xff1a; 功能&#xff1a; 自定義物體占用區域的大小一鍵調整占用區域調整旋轉度數&#xff0c;分四個擋位&#xff1a; NoRotation&#xff1a;該物體不能調整旋轉。MaximumAngle&#xff1a;每次轉動90。NormalAngle&#xff1a;每次轉動45&#xff…

根據租戶id切換數據源

花了半天時間&#xff0c;使用spring-boot實現動態數據源&#xff0c;切換自如 在一個項目中使用多個數據源的情況很多&#xff0c;所以動態切換數據源是項目中標配的功能&#xff0c;當然網上有相關的依賴可以使用&#xff0c;比如動態數據源&#xff0c;其依賴為&#xff0c;…

銀河麒麟解壓命令

銀河麒麟&#xff08;Kylin&#xff09;操作系統是基于Linux的操作系統分支之一&#xff0c;其使用的解壓命令與Linux系統中的命令基本相同。 在銀河麒麟系統中&#xff0c;常用的解壓命令有以下幾種&#xff1a; 對于.tar文件&#xff1a; tar -xvf file.tar對于.tar.gz或.…

探索營銷系統業務架構的設計與應用

隨著市場競爭的日益激烈和消費者需求的不斷變化&#xff0c;營銷系統作為企業營銷管理的重要組成部分&#xff0c;扮演著至關重要的角色。本文將深入探討營銷系統業務架構的設計與應用&#xff0c;從客戶關系管理、營銷活動管理、數據分析和智能化服務等方面進行全面解析&#…

Innodb Buffer Pool緩存機制(四)預讀與Mysql改進的LRU策略

一、什么是預讀 InnoDB提供了預讀(read ahead)。所謂預讀&#xff0c;就是InnoDB認為執行當前的請求可能之后會讀取某些頁面&#xff0c;就預先把它們加載到Buffer Pool中。根據觸發方式的不同&#xff0c;預讀又可以細分為下邊兩種&#xff1a; 1.1 線性預讀 InnoDB提供了一…

掘金AI商戰寶典-高階班:如何用AI制作視頻(11節視頻課)

課程下載&#xff1a;掘金AI商戰寶典-高階班&#xff1a;如何用AI制作視頻(11節視頻課)-課程網盤鏈接提取碼下載.txt資源-CSDN文庫 更多資源下載&#xff1a;關注我。 課程目錄&#xff1a; 1-第一講用AI自動做視頻(上)_1.mp4 2-第二講用AI自動做視頻(中)_1.mp4 3-第四講A…

U9C的數據查詢視圖Sql

U9C的數據查詢視圖Sql if object_id(TEMPDB..#priceTable) is not null begin drop table #priceTable endcreate table #priceTable (polineCreatedOn date,price varchar(max),itemid varchar(max),purchaseOrderdocno varchar(max),)insert into #priceTable select max(…

阿里云郵件推送服務配置教程:怎么做批發?

阿里云郵件推送的API配置步驟&#xff1f;配置教程有哪些步驟&#xff1f; 阿里云郵件推送服務憑借其高并發、穩定性強和安全性高等特點&#xff0c;成為眾多企業的首選。Aok將詳細介紹如何使用阿里云郵件推送服務進行批發配置&#xff0c;并簡要提及AokSend的優勢。 阿里云郵…

UE4_環境_材質函數

學習筆記&#xff0c;不喜勿噴&#xff0c;歡迎指正&#xff0c;侵權立刪&#xff01; 1、建立材質函數Distance_Fun&#xff0c;勾選公開到庫。 2、添加函數輸入節點FunctionInput&#xff0c; 這個輸入我們想作為混合材質屬性BlendMaterialAttributes的alpha輸入節點&#x…

022、鍵管理_遍歷鍵

Redis提供了兩個命令遍歷所有的鍵,分別是keys和scan 1.全量遍歷鍵 keys patternkeys命令是支持pattern匹配的 127.0.0.1:6379> dbsize (integer) 0 127.0.0.1:6379> mset hello world redis best jedis best hill high OK如果要獲取所有的鍵,可以使用keys pattern命…

手擼 串口交互命令行 及 AT應用層協議解析框架

在嵌入式系統開發中&#xff0c;命令行接口&#xff08;CLI&#xff09;和AT命令解析是常見的需求。CLI提供了方便的調試接口&#xff0c;而AT命令則常用于模塊間的通信控制。本文將介紹如何手動實現一個串口交互的命令行及AT應用層協議解析框架&#xff0c;適用于FreeRTOS系統…

06Docker-Compose和微服務部署

Docker-Compose 概述 Docker Compose通過一個單獨的docker-compose.yml模板文件來定義一組相關聯的應用容器&#xff0c;幫助我們實現多個相互關聯的Docker容器的快速部署 一般一個docker-compose.yml對應完整的項目,項目中的服務和中間件對應不同的容器 Compose文件實質就…

鋰電池壽命預測 | Matlab基于SSA-SVR麻雀優化支持向量回歸的鋰離子電池剩余壽命預測

目錄 預測效果基本介紹程序設計參考資料 預測效果 基本介紹 【鋰電池剩余壽命RUL預測案例】 鋰電池壽命預測 | Matlab基于SSA-SVR麻雀優化支持向量回歸的鋰離子電池剩余壽命預測&#xff08;完整源碼和數據&#xff09; 1、提取NASA數據集的電池容量&#xff0c;以歷史容量作…

【C++課程學習】:類和對象(上)(類的基礎詳細講解)

&#x1f381;個人主頁&#xff1a;我們的五年 &#x1f50d;系列專欄&#xff1a;C課程學習 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 目錄 &#x1f35f;1.1類的引出&#xff1a; &#x1f35f;1.2類的結構&#xff1a; &#x1f35f;1.3類的…

LeetCode-82. 刪除排序鏈表中的重復元素 II【鏈表 雙指針】

LeetCode-82. 刪除排序鏈表中的重復元素 II【鏈表 雙指針】 題目描述&#xff1a;解題思路一&#xff1a;用一個cur即可實現去重cur.next cur.next.next背誦版&#xff1a;解題思路三&#xff1a;0 題目描述&#xff1a; 給定一個已排序的鏈表的頭 head &#xff0c; 刪除原始…

【java前端課堂】02_類和方法的定義區別

目錄 簡介&#xff1a; 類 方法 類和方法之間的主要區別如下&#xff1a; 定義與結構&#xff1a; 實例化&#xff1a; 作用范圍&#xff1a; 生命周期&#xff1a; 下面是一個簡單的Java類和方法示例&#xff1a; 簡介&#xff1a; 類 在Java&#xff08;以及許多其他面向…