【Python設計模式06】代理模式

代理模式(Proxy Pattern)是一種結構型設計模式,它通過創建代理對象來控制對另一個對象的訪問。代理模式可以用于延遲實例化、控制訪問權限、記錄日志等。代理模式的核心思想是為其他對象提供一種代理,以控制對這個對象的訪問。

代理模式的結構

代理模式主要包括以下幾個角色:

  1. 抽象主題(Subject):定義代理類和真實類的共同接口。
  2. 真實主題(RealSubject):實現抽象主題接口,是真正需要使用的對象。
  3. 代理(Proxy):實現抽象主題接口,并持有對真實主題對象的引用。

代理模式的類型

代理模式有多種類型,包括:

  1. 遠程代理:為一個位于不同地址空間的對象提供代理,隱藏實際對象的存在。
  2. 虛擬代理:根據需要創建開銷大的對象,進行延遲實例化。
  3. 保護代理:控制對原始對象的訪問,保護其不被隨意訪問和修改。
  4. 智能引用代理:在訪問對象時,提供額外的操作,如引用計數、日志記錄等。

示例

以下示例展示了一個虛擬代理的實現,用于延遲實例化開銷大的對象。

定義抽象主題和真實主題
from abc import ABC, abstractmethodclass Image(ABC):@abstractmethoddef display(self):passclass RealImage(Image):def __init__(self, filename: str):self.filename = filenameself.load_image_from_disk()def load_image_from_disk(self):print(f"Loading {self.filename}")def display(self):print(f"Displaying {self.filename}")
定義代理類
class ProxyImage(Image):def __init__(self, filename: str):self.filename = filenameself.real_image = Nonedef display(self):if self.real_image is None:self.real_image = RealImage(self.filename)self.real_image.display()
使用代理類
def main():image = ProxyImage("test_image.jpg")# 圖像尚未加載print("Image will be displayed now:")image.display()  # 加載并顯示圖像# 圖像已加載,不需要再次加載print("\nImage will be displayed again:")image.display()  # 直接顯示圖像if __name__ == "__main__":main()

在這個示例中,Image是抽象主題,RealImage是具體主題,實現了圖像的加載和顯示。ProxyImage是代理類,通過延遲實例化的方式,控制對RealImage對象的訪問。在第一次調用display方法時,代理類會實例化RealImage對象并加載圖像,后續調用則直接顯示圖像而不需要重新加載。

代理模式的優缺點

優點
  1. 控制對象訪問:通過代理類,可以控制對真實對象的訪問權限和方式。
  2. 延遲加載:虛擬代理可以延遲實例化開銷大的對象,提高系統性能。
  3. 增強功能:智能引用代理可以在訪問對象時增加額外的操作,如日志記錄、性能監控等。
缺點
  1. 增加復雜性:引入代理模式會增加系統的復雜性,增加類的數量。
  2. 性能開銷:代理模式可能會引入額外的性能開銷,特別是在代理類和真實類之間的轉換較頻繁時。

代理模式的適用場景

  1. 遠程代理:為位于不同地址空間的對象提供本地代理,以隱藏實際對象的存在。
  2. 虛擬代理:根據需要創建開銷大的對象,進行延遲實例化。
  3. 保護代理:控制對原始對象的訪問,保護其不被隨意訪問和修改。
  4. 智能引用代理:在訪問對象時,提供額外的操作,如引用計數、日志記錄等。

總結

代理模式是一種結構型設計模式,通過代理對象控制對真實對象的訪問。代理模式可以用于延遲實例化、控制訪問權限、記錄日志等。通過合理應用代理模式,可以提高系統的靈活性和可擴展性,同時也需要注意代理模式可能帶來的復雜性和性能開銷。代理模式在實際開發中有著廣泛的應用,理解并熟練掌握這一模式,有助于構建高效、可維護的系統。

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

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

相關文章

System32文件夾千萬不能刪除,看完這篇你就知道為什么了

序言 C:\Windows\System32目錄是Windows操作系統的關鍵部分,重要的系統文件存儲在該目錄中。網上的一些惡作劇者可能會告訴你刪除它,但你不應該嘗試去操作,如果你嘗試的話,我們會告訴你會發生什么。 什么是System32文件夾 位于C:\Windows\System32的System32文件夾是所有…

Python深度學習:【模型系列】Transformer面試靈魂20問

1. transformer簡介 Transformer模型是一種基于自注意力機制的神經網絡架構,主要用于處理序列數據,如自然語言處理任務。它由Google在2017年提出,并在“Attention is All You Need”這篇論文中首次公開。Transformer模型的核心思想是利用自注意力機制來捕捉序列中的依賴關系…

MySQL 的表約束詳解

在數據庫設計中,約束(Constraints)是確保數據完整性和一致性的關鍵工具。MySQL 作為流行的關系型數據庫管理系統,提供了多種約束類型來維護數據的準確性和可靠性。本文將詳細探討 MySQL 的各種表約束,包括它們的定義、…

【代碼隨想錄】面試常考類型之動態規劃01背包

前言 更詳細的在大佬的代碼隨想錄 (programmercarl.com) 本系列僅是簡潔版筆記,為了之后方便觀看 不同的二叉搜索樹 96. 不同的二叉搜索樹 - 力扣(LeetCode) 通過舉例子發現重疊子問題 代碼很簡單,主要是思路問題&#xff0…

Windows內核函數 - 創建關閉注冊表

在驅動程序的開發中,經常會用到對注冊表的操作。與Win32的API不同,DDK提供另外一套對注冊表操作的相關函數。首先明確一下注冊表里的幾個概念,避免在后面混淆。 圖1 注冊表概念 有5個概念需要重申一下: * 注冊表項: 注…

008、字符串_內部編碼

字符串類型的內部編碼有3種: int:8個字節的長整型。 embstr:小于等于39個字節的字符串。 raw:大于39個字節的字符串。 Redis會根據當前值的類型和長度決定使用哪種內部編碼實現。 整數類型示例如下: 127.0.0.1:6379&…

使用 MyBatis-Plus 的 IService 進行模糊查詢操作

使用 MyBatis-Plus 的 IService 進行模糊查詢操作 一、前言1. 普通模糊查詢(like)2. 左模糊查詢(likeLeft)3. 右模糊查詢(likeRight)4. 不匹配指定字符串的模糊查詢(notLike) 一、前…

unity接入live2d

在bilibili上找到一個教程,首先注意一點,你直接導入那個sdk,并且打開示例,顯示的模型是有問題的,你需要調整模型上腳本的一個枚舉值,調整它的渲染順序是front z to我看教程時候,很多老師都沒有提…

常用匯編指令

(arg)argument:自變量,變元 (reg)register:寄存器 (seg)segment:段寄存器 (mem)memory:存儲器(內存單元&am…

什么是 BIO、NIO、AIO?

BIO、NIO、AIO 都是 Java 的 IO 模型 BIO (Blocking IO) 是傳統的 IO 模型,它在讀寫數據時會阻塞線程,直到數據讀寫完成,適用于并發不高的場景。 NIO (Non-blocking IO) 是 Java 的新 IO 模型,它在讀寫數據時不會阻塞線程&#…

Flutter 中的 AnimatedPositionedDirectional 小部件:全面指南

Flutter 中的 AnimatedPositionedDirectional 小部件:全面指南 在 Flutter 中,AnimatedPositionedDirectional 是一個用于創建具有方向感知的動畫定位效果的組件。它允許開發者在動畫過程中動態地改變子組件的位置,并且可以指定動畫的方向&a…

Android Compose 九:interactionSource 的使用

先上官方文檔 InteractionSource InteractionSource represents a stream of Interactions corresponding to events emitted by a component. These Interactions can be used to change how components appear in different states, such as when a component is pressed or…

數據庫技術都涵蓋那些內容

數據庫技術涵蓋了關系型數據庫(RDBMS)、非關系型數據庫(NoSQL)以及數據庫管理系統(DBMS)的其他方面。以下是一些我熟悉的數據庫技術: 關系型數據庫(RDBMS) MySQL&#…

溫故而知新-Spring篇【面試復習】

溫故而知新-Spring篇【面試復習】 前言版權推薦溫故而知新-Spring篇IOCAOP循環依賴springboot如果要對屬性文件中的賬號密碼加密如何實現?SpringBoot的優點Spring Boot 的核心注解是哪個?它主要由哪幾個注解組成的? 最后 前言 2023-7-31 15:…

Java RMI

RMI - 安全篇 RMI分為三個主體部分: *Client-客戶端*:客戶端調用服務端的方法 *Server-服務端*:遠程調用方法對象的提供者,也是代碼真正執行的地方,執行結束會返回給客戶端一個方法執行的結果。 *Registry-注冊中心…

詞嵌入nn.embedding的解釋

一、embedding如何處理文本 在NLP任務中,首先要對文本進行處理,將文本進行編碼轉換,形成向量表達,embedding處理文本的流程如下: (1)輸入一段文本,中文會先分詞(如jieb…

python雙色球選號程序的實現與解析

新書上架~👇全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目錄 一、引言:雙色球選號游戲的魅力 二、程序設計與實現 1. 生成紅色球號碼 2. 生…

3.游戲中自定義數據類型的解讀分析

知識來源于騰訊課堂易道云 結構的解釋: 計算機里的所有東西都是用二進制表示的,二進制是數字,我們用的阿拉伯數字0-9這個數字是十進制,計算機用的是二進制只有0或1,然后都是一堆0或1的數字,游戲中怎么把這…

AD使用問題

設計流程: 1.先創建項目——添加原理圖,原理圖庫,PCB,PCB庫 2.畫原理圖庫和封裝庫 主要有三種方法: (1)手動畫庫和封裝,常常用于嘉立創查詢不到的器件 (2&#xff0…

雙機多網口配置同網段地址,可以通過目的IP確定接收數據的網卡嗎?

環境 兩臺機器兩網卡同網段接入同一個二層交換機。 機器A ens38 00:0c:29:a4:8b:fb 10.0.0.11/24 ens39 00:0c:29:a4:8b:05 10.0.0.12/24 機器B ens38 00:0c:29:4f:a6:c4 10.0.0.21/24 ens39 00:0c:29:4f:a6:ce 10.0.0.22/24 初始ARP表 只有管理口接口的ARP表項&#xff0c…