第十四節 代理模式

在代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式。

在代理模式中,我們創建具有現有對象的對象,以便向外界提供功能接口。

介紹

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

主要解決:在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由于某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。

何時使用:想在訪問一個類時做一些控制。

如何解決:增加中間層。

關鍵代碼:實現與被代理類組合。

應用實例: 1、Windows 里面的快捷方式。 2、豬八戒去找高翠蘭結果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來,高翠蘭本人和孫悟空都實現了這個接口,豬八戒訪問高翠蘭的時候看不出來這個是孫悟空,所以說孫悟空是高翠蘭代理類。 3、買火車票不一定在火車站買,也可以去代售點。 4、一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現金,并提供對簽發人賬號上資金的控制。 5、spring aop。

優點: 1、職責清晰。 2、高擴展性。 3、智能化。

缺點: 1、由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。 2、實現代理模式需要額外的工作,有些代理模式的實現非常復雜。

使用場景:按職責來劃分,通常有以下使用場景: 1、遠程代理。 2、虛擬代理。 3、Copy-on-Write 代理。 4、保護(Protect or Access)代理。 5、Cache代理。 6、防火墻(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

注意事項: 1、和適配器模式的區別:適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口。 2、和裝飾器模式的區別:裝飾器模式為了增強功能,而代理模式是為了加以控制。

實現

我們將創建一個 Image 接口和實現了 Image 接口的實體類。ProxyImage 是一個代理類,減少 RealImage 對象加載的內存占用。

ProxyPatternDemo,我們的演示類使用 ProxyImage 來獲取要加載的 Image 對象,并按照需求進行顯示。

代理模式的 UML 圖

步驟 1

創建一個接口。

Image.java

public interface Image {void display();
}

步驟 2

創建實現接口的實體類。

RealImage.java

public class RealImage implements Image {private String fileName;public RealImage(String fileName){this.fileName = fileName;loadFromDisk(fileName);}@Overridepublic void display() {System.out.println("Displaying " + fileName);}private void loadFromDisk(String fileName){System.out.println("Loading " + fileName);}
}

ProxyImage.java

public class ProxyImage implements Image{private RealImage realImage;private String fileName;public ProxyImage(String fileName){this.fileName = fileName;}@Overridepublic void display() {if(realImage == null){realImage = new RealImage(fileName);}realImage.display();}
}

步驟 3

當被請求時,使用 ProxyImage 來獲取 RealImage 類的對象。

ProxyPatternDemo.java

public class ProxyPatternDemo {public static void main(String[] args) {Image image = new ProxyImage("test_10mb.jpg");//圖像將從磁盤加載image.display(); System.out.println("");//圖像將無法從磁盤加載image.display();     }
}

步驟 4

驗證輸出。

Loading test_10mb.jpg
Displaying test_10mb.jpgDisplaying test_10mb.jpg

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

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

相關文章

訓推一體 | 暴雨X8848 G6服務器 x Intel?Gaudi? 2E AI加速卡

近日,暴雨信息攜手英特爾,針對Gaudi 2E AI加速器HL-288 PCIe卡(簡稱IntelGaudi 2E PCIe卡,下同)完成專項調優與適配工作,并重磅推出Intel Eagle Stream平臺4U8卡解決方案。該方案通過軟硬件協同優化&#x…

GB17761-2024標準與電動自行車防火安全的技術革新

隨著我國電動自行車保有量突破3.5億輛,這一便捷的交通工具已成為城市出行的重要組成。然而,伴隨市場規模擴大而來的是日益突出的安全問題——2023年全國電動自行車火災事故高達2.5萬起,年均增長率約20%,火災中塑料件加速燃燒并釋放…

利用容器編排完成haproxy和nginx負載均衡架構實施

1 創建測試目錄和文件[rootdocker-a ~]# mkdir lee [rootdocker-a ~]# cd lee/ [rootdocker-a lee]# touch docker-compose.yml # 容器編排工具Docker Compose 默認識別docker-compose.yml文件2 編寫docker-compose.yml文件和haproxy.cfg文件2.1 核心配置說明2.1.1 服務結構共定…

WinRAR v7.13 烈火漢化穩定版,解壓縮全格式專家

[軟件名稱]: WinRAR v7.13 烈火漢化穩定版 [軟件大小]: 3.8 MB [下載通道]: 夸克盤 | 迅雷盤 軟件介紹 WinRAR 壓縮文件管理器,知名解壓縮軟件,電腦裝機必備軟件,國內最流行最好用的壓縮文件管理器、解壓縮必備軟件。它提供 RAR 和 ZIP 文…

強化學習常用數據集

強化學習常用數據集數學推理數據集數值標簽GSM8K(2021 OpenAI)問答數據集在LLM場景下進行強化學習訓練的時候,時常會涉及到各種各樣的數據集,容易記不住,因此開個帖子記錄一下。可采取的分類方法有很多,這里直接按照領…

ROS2學習(1)—基礎概念及環境搭建

文章目錄核心框架環境搭建小烏龜機器人控制小烏龜啟動鍵盤控制啟動rqt查看ros節點關系核心框架 這里有幾個比較重要的概念: 四大通信機制:話題(Topic)、服務(Service)、動作(Action&#xff09…

基于STM32單片機超聲波測速測距防撞報警設計

1 系統功能介紹 本設計是一套基于 STM32F103C8T6 單片機 的超聲波測速測距防撞報警系統,能夠實現對目標物體的實時測距與測速,并通過 TFT 彩屏進行動態顯示,同時根據用戶設定的距離與速度閾值進行報警提示。該系統不僅可以用于固定場景的安全…

麒麟系統播放 pptx

目錄 python 操作 LibreOffice 控制pptx 一頁一頁播放 1. 安裝 LibreOffice(麒麟系統基于 Debian/Ubuntu) 2. 如果只想安裝 PPT 播放/轉換(Impress) 1. 啟動 LibreOffice UNO 服務 2. Python 控制播放uno安裝方法&#xff1a…

嵌入式Linnux學習 -- 軟件編程2

四、IO1. 概念1. IO 指 input / output2. Linux系統中一切皆是文件3. IO操作的對象是文件2. 文件1. 概念一段數據的集合2. 特點文件通常存放在外存中,掉點后數據不會丟3. 分類b(block,塊設備文件)-- 按塊掃描信息的文件&#x…

Spark02 - SparkContext介紹

一、應用入口:SparkContextSpark Application 程序入口為:SparkContext,任何一個應用首先需要構建 SparkContext 對象,如下兩步構建:第一步、創建 SparkConf 對象設置 Spark Application 基本信息,比如應用…

Selenium動態元素定位

動態元素定位方法一:使用CSS選擇器通過部分匹配操作符定位動態屬性中的固定部分。*(包含),^(開頭),$(結尾)。/* 匹配id前綴為user_的元素 */ cssdiv[id^"user_"…

OBOO鷗柏丨115寸商用屏/工業液晶顯示器招標投標核心標底參數要求

整機參數要求:商用液晶顯示器/工業LCD一體機/商業智能終端機/工業防爆顯示器/招標投標核心標底參數要求1、整機屏幕采用≥采用115英寸超高清原廠原包原裝工業LCD液晶屏面板;具有高色域,顯示動態視頻、web及3D動畫時,保障運動畫面流…

麻溜啟動Oracle實例demo

注意:鏡像非常大并且外網網絡過慢,可能得pull一天(n次超時)。。md后臺靜默pull命令: nohup docker pull container-registry.oracle.com/database/express:latest > pull.log 2>&1 & 啟動實例&#xff1…

應用監控工具Skywalking

目錄 Skywalking介紹 Skywalking架構 Skywalking安裝 Skywalking使用 Skywalking配置 Skywalking數據持久化 Skywalking告警 Skywalking介紹 Apache Skywalking是一個開源的應用性能監控(Application Performance Monitoring,APM)工具…

TCP服務建立的全流程詳解

TCP的服務監聽步驟(等待客戶端連接前)TCP 服務器通過以下步驟完成從初始化到等待客戶端連接,為后續的數據傳輸(send()/recv())奠定了基礎一、創建套接字(Socket)作用:套接字是網絡通…

數據結構 雙鏈表與LinkedList

本節目標: 認識并且能夠實現一個雙鏈表認識LinkedList類并且知道如何去使用 1.雙鏈表 概念 在數據結構中,雙鏈表(Doubly Linked List) 是一種常見的線性數據結構,它由一系列節點組成,每個節點不僅包含數據…

如何解決 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本區域選擇問題:key is invalid

如何解決 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本區域選擇問題:key is invalid 在 JetBrains 發布的 IntelliJ IDEA、PyCharm 2024.2 和 2025.2 新版本中,增加了一個新的功能——區域選擇。在設置菜單中,你可以找到這一選項&#…

GSON 框架下百度天氣 JSON 數據轉 JavaBean 的實戰攻略

目錄 前言 一、百度天氣JSON 1、請求參數 2、返回參數 3、屬性映射 二、GSON屬性映射實戰 1、類對象映射 2、屬性字段映射 3、日期數據映射 三、天氣接口對象展示 1、接口調用 2、Java屬性打印輸出 四、總結 前言 在當今數字化時代,數據的高效處理與轉換…

NAS技術在縣級融媒體中心的架構設計與安全運維淺析

NAS技術在縣級融媒體中心的架構設計與安全運維淺析 ——原理剖析、應用實踐與防御體系建設作者:高級網絡安全工程師 吉林?鎮賚融媒 劉曉偉 最后更新:2025年8月 適用對象:媒體行業網絡安全從業者一、NAS技術核心原理剖析 1. 基礎架構 NAS&am…

CobaltStrike的搭建和使用

下載CobaltStrike環境建議使用jdk17,其他java版本有些功能可能無法使用通過網盤分享的文件:CS4.7key-mht.zip 鏈接: https://pan.baidu.com/s/1CRd1x4r6EIk14BD3UCLgxw?pwdevf4 提取碼: evf4將下載的文件分別放在服務器和 本地/kali 上 也就是服務器為…