結構型——代理模式

結構型——代理模式

代理模式指的是通過創建一個代理來控制對原始對象的訪問。代理在客戶端與實際對象之間充當“中介”

特點

  • 訪問控制:代理對象可以控制對實際對象的訪問,從而實現對訪問權限的控制。
  • 延遲加載:代理對象可以在實際對象被調用時才創建,從而實現延遲加載。
  • 解耦: 客戶端金依賴代理接口,可以與實際對象分離,從而實現解耦。
  • 類型多樣:虛擬代理(既延遲加載)、緩存代理(緩存對象)、遠程代理(遠程對象)、保護代理(權限控制)等。

模式結構

角色描述
抽象主題 (Subject)聲明真實主題和代理主題的共同接口。客戶端依賴此接口
真實主題 (RealSubject)實現抽象主題定義的接口,并提供其功能實現。實際執行業務邏輯的對象
代理主題 (Proxy)實現抽象主題定義的接口,并持有真實主題的引用。代理主題控制對真實主題的訪問

代理模式類型

類型應用場景
虛擬代理當需要創建一個大開銷的對象時,創建一個代理對象,直到需要時才創建真實的對象。
也叫延遲加載(比如在圖片加載時,先加載一張占位圖,當圖片加載完成后再替換占位圖)。
保護代理控制權限(在客戶端對真實對象進行訪問前,利用代理進行權限校驗等操作)。
緩存代理緩存調用結果(為優化性能,將重復計算的值緩存起來,下次使用時直接返回緩存值)。
遠程代理本地代理遠程服務(將本地的請求轉發到遠程的對象上)。

簡單示例

1. 虛擬代理

from abc import ABC, abstractmethod# 抽象主題
class Image(ABC):@abstractmethoddef display(self):pass# 真實主題(大開銷對象)
class RealImage(Image):def __init__(self, filename):self.filename = filenameself.load_from_disk()def load_from_disk(self):print(f"Loading {self.filename} from disk")def display(self):print(f"Displaying {self.filename}")# 代理主題(控制加載時機)
class ProxyImage(Image):def __init__(self, filename):self.filename = filenameself.real_image = None      # 延遲加載def display(self):if not self.real_image:self.real_image = RealImage(self.filename)self.real_image.display()# 客戶端代碼
if __name__ == "__main__":# 創建代理,此時不會實際加載圖片proxy_image = ProxyImage("test_image.jpg")             # Loading test_image.jpg from disk# 當需要展示時,實際去加載顯示proxy_image.display()                                  # Displaying test_image.jpg

2. 保護代理

from abc import ABC, abstractmethod# 抽象主題
class DataBase(ABC):@abstractmethoddef query(self, sql):pass# 真實主題(實現對數據庫的查詢操作)
class RealDataBase(DataBase):def query(self, sql):return f"query result: {sql}"# 代理(對請求對象進行攔截,權限驗證)
class ProxyDataBase(DataBase):def __init__(self, user):self.user = userself.real_db = RealDataBase()def query(self, sql):if self._check_access():return self.real_db.query(sql)else:return "access denied"def _check_access(self):return self.user == "admin"# 客戶端代碼
if __name__ == "__main__":proxy_db = ProxyDataBase("admin")print(proxy_db.query("select * from user"))         # query result: ....proxy_db = ProxyDataBase("guest")print(proxy_db.query("select * from user"))         # access denied

3. 緩存代理

from abc import ABC, abstractmethodclass Calculate(ABC):@abstractmethoddef calculate(self, n): passclass RealCalculate(Calculate):def calculate(self, n):return n * nclass ProxyCalculate(Calculate):def __init__(self):self.cache = {}self.real_calculate = RealCalculate()def calculate(self, n):if n not in self.cache:self.cache[n] = self.real_calculate.calculate(n)return self.cache[n]if __name__ == '__main__':proxy_calculate = ProxyCalculate()for i in range(10):print(proxy_calculate.calculate(i))         # 第一次計算,緩存for i in range(10):print(proxy_calculate.calculate(i))         # 第二次計算,直接從緩存中取

4.遠程代理

import requestsclass BaiduService:def get_data(self, question): passclass BaiduServiceProxy(BaiduService):def __init__(self):self.question = questionself.baidu_api = "www.baidu.com"def get_data(self, question):response = requests.get(self.baidu_api, params={"question": question})return response.text# 客戶端代碼
if __name__ == "__main__":# 客戶端僅與代理交互,無需感知遠程服務的存在baidu_service = BaiduServiceProxy()data = baidu_service.get_data("如何使用代理模式")

代理模式 VS 外觀模式 VS 裝飾器模式 VS 適配器模式

維度代理模式外觀模式裝飾器模式適配器模式
核心目的控制對象訪問簡化復雜系統接口動態擴展對象功能接口兼容性轉換
結構特點代理與真實對象實現相同接口外觀類聚合多個子系統接口裝飾器模式聚合被裝飾對象適配器模式聚合被適配對象
對象關系代理對象持有真實對象外觀持有多個子系統對象裝飾器包裹原始對象適配器持有或繼承被適配對象
接口一致性保持與真實對象接口一致提供新的簡化接口保持與原始對象接口一致轉換接口以匹配目標需求
擴展方向訪問控制邏輯接口簡化與整合功能疊加接口適配

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

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

相關文章

【算法】常見排序算法(插入排序、選擇排序、交換排序和歸并排序)

文章目錄 前言一、排序概念及常見排序算法框圖1.排序概念2.常見排序算法框圖 二、實現比較排序算法1.插入排序1.1 直接插入排序1.2 希爾排序 2.選擇排序2.1 直接選擇排序2.2 堆排序 3.交換排序3.1 冒泡排序3.2 快速排序3.2.1 hoare版本3.2.2 挖坑法3.2.3 lomuto前后指針 3.3 快…

Go語言分布式鎖實戰:dlock助力構建高并發穩定系統

在構建分布式系統時,一個常見且棘手的問題便是資源競爭和數據一致性問題。分布式鎖作為一種常用的解決方案,在多個進程或節點之間協調訪問共享資源時顯得尤為重要。今天,我們將介紹一款分布式鎖庫——dlock,并通過詳細的使用示例帶…

算法方法快速回顧

(待修改) 目錄 1. 雙指針2. 滑動窗口理論基礎 3. 二分查找3. 二分查找理論基礎 4. KMP5. 回溯算法6. 貪心算法7. 動態規劃7.1. 01背包7.2. 完全背包7.3. 多重背包 8. 單調棧9. 并查集10. 圖論10.1. 廣度優先搜索(BFS)10.2. 深度優…

深度學習:讓機器學會“思考”的魔法

文章目錄 引言:從“鸚鵡學舌”到“舉一反三”一、深度學習是什么?1. 定義:機器的“大腦”2. 核心思想:從數據中“悟”出規律 二、深度學習的“大腦”結構:神經網絡1. 神經元:深度學習的基本單元2. 神經網絡…

電動自行車/電動工具鋰電池PCM方案--SH367003、SH367004、SH79F329

在消費電子系統中,如手機電池包,筆記本電腦電池包等,帶有控制IC、功率MOSFETFE管以及其他電子元件的電路系統稱為電池充放電保護板Protection Circuit Module (PCM),而對于動力電池的電池管理系統&#xff…

補碼詳細分析

補碼引入 舉一個生活化的例子 假設由一個掛鐘,它只能順時鐘調時間,那么它調時間就分成了一下兩種情況 正好順時針調就能調好 如:時針從5調到9需要逆時針調才能調好 如:時針從10調到7 在上面的情況中1是不用處理的,2…

計算機網絡入門:物理層與數據鏈路層詳解

🌐 (專業解析 中學生也能懂!) 📖 前言 計算機網絡就像數字世界的“高速公路系統”,而物理層和數據鏈路層是這條公路的基石。本文用 專業視角 和 生活化比喻 ,帶你輕松理解這兩層的核心原理&a…

哪些視頻格式在webview2中播放可以設置成透明的?

在WebView2中,能夠播放并設置成透明背景的視頻格式主要取決于其支持的編解碼器以及視頻是否包含alpha通道(透明度信息)。以下是支持透明背景的視頻格式: 支持透明背景的視頻格式 1. WebM(使用VP9編解碼器) …

【基于ROS的A*算法實現路徑規劃】A* | ROS | 路徑規劃 | Python

### 記錄一下使用Python實現ROS平臺A*算法路徑規劃 ### 代碼可自取 :Xz/little_projecthttps://gitee.com/Xz_zh/little_project.git 目錄 一、思路分析 二、算法實現 三、路徑規劃實現 一、思路分析 要求使用A*算法實現路徑規劃,可以將該任務分為三…

2025-03-23 吳恩達機器學習3——多維特征

文章目錄 1 多元引入2 矢量化2.1 示例2.2 非矢量化實現2.3 矢量化實現2.4 應用 3 特征縮放3.1 舉例3.2 必要性3.3 方法3.3.1 最大最小值縮放(Min-Max Scaling)3.3.2 均值歸一化(Mean Normalization)3.3.3 Z 分數歸一化&#xff08…

正點原子內存管理學習和修改

由于項目需要用到內存管理進行動態申請和釋放,今天又重新學習了一下正點原子的內存管理實驗,溫習了一下內存管理的實質。首先先上正點原子內存管理的源代碼: malloc.c文件: #include "./MALLOC/malloc.h"#if !(__ARMC…

時空觀測者:俯身拾貝

目錄 中華文明時空貝殼集(按時間排序)1. 良渚玉琮(約公元前3300-2300年)2. 三星堆青銅神樹(公元前1200年)3. 殷墟甲骨文(約公元前14世紀)4. 京杭大運河(公元前486年始建&…

護網期間監測工作全解析:內容與應對策略

護網期間監測工作全解析:內容與應對策略 一、引言 在數字化浪潮中,網絡安全的重要性愈發凸顯,護網行動作為保障關鍵信息基礎設施安全的關鍵舉措,備受矚目。護網期間,監測工作是發現潛在威脅、防范攻擊的重要防線。全…

【Centos7搭建Zabbix4.x監控HCL模擬網絡設備:zabbix-server搭建及監控基礎05

蘭生幽谷,不為莫服而不芳; 君子行義,不為莫知而止休。 5.zabbix監控HCL模擬網絡設備 在保證zabbix-server與HCL網絡相通的情況下進行如下操作。 5.1創建主機群 配置-主機群-創建主機群 圖 19 取名,添加。 圖 20 5.2 創建監控…

趣味極簡品牌海報藝術貼紙設計圓潤邊緣無襯線粗體裝飾字體 Chunko Bold - Sans Serif Font

Chunko Bold 是一種功能強大的顯示字體,體現了大膽極簡主義的原則 – 當代設計的主流趨勢。這種自信的字體將粗獷的幾何形狀與現代的趣味性相結合,具有圓潤的邊緣和強烈的存在感,與當今的極簡主義設計方法完美契合。無論是用于鮮明的構圖還是…

Spring Boot(十七):集成和使用Redis

Redis(Remote Dictionary Server,遠程字典服務器)是一個開源的、基于內存的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。Spring Boot 中集成和使用Redis主要涉及以下幾個步驟: 添加依賴 在項目的pom.xml文件中添加Redis的依賴。Spring Boot提供了對Redis的集…

2025-03-21 Unity 序列化 —— 自定義2進制序列化

文章目錄 前言1 項目結構1.1 整體1.2 代碼 2 實現2.1 Processor2.1.1 BaseType2.1.2 CollectionType2.1.3 CustomType 2.2 ByteFormatter2.3 ByteHelper 3 使用 前言 ? BinaryFormatter 類可以將 C# 類對象快速轉換為字節數組數據。 ? 在網絡開發時,不會使用 Bi…

為WordPress自定義一個留言板

要在WordPress中創建一個留言反饋表單,并實現后臺管理功能,您可以按照以下步驟進行操作: 1. 創建留言反饋表單 首先,您需要使用一個表單插件來創建表單。推薦使用 Contact Form 7 或 WPForms。以下是使用 Contact Form 7 的示例…

嵌入式項目:利用心知天氣獲取天氣數據實驗方案

【實驗目的】 1、利用心知天氣服務器獲取指定位置天氣數據 2、將天氣數據解析并可視化顯示到OLED屏幕 【實驗原理】 【實驗步驟】 官網注冊

go-zero學習筆記

內容不多,只有部分筆記,剩下的沒有繼續學下去,包括路由與處理器、日志中間件、請求上下文 文章目錄 1、go-zero核心庫1.1 路由與處理器1.2 日志中間件1.3 請求上下文 1、go-zero核心庫 1.1 路由與處理器 package mainimport ("github…