網站首頁 編程語言 正文
一、代理模式
代理模式,為其他對象提供一種代理,以此控制一個對象的訪問方式。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
二、應用場景
遠程(Remote)代理:為一個位于不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是在本機器中,也可是在另一臺機器中。遠程代理又叫做大使(Ambassador
)。好處是系統可以將網絡的細節隱藏起來,使得客戶端不必考慮網絡的存在。
虛擬(Virtual)代理:根據需要創建一個資源消耗較大的對象,使得此對象只在需要時才會被真正創建,例如:圖片延遲加載。使用虛擬代理模式的好處就是代理對象可以在必要的時候才將被代理的對象加載;代理可以對加載的過程加以必要的優化。當一個模塊的加載十分耗費資源的情況下,虛擬代理的好處就非常明顯。
保護代理(Protection Proxy ):控制對原始對象的訪問。保護代理用于對象應該有不同 的訪問權限的時候。
智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。
三、代碼示例
實體角色:
- 抽象角色(Subject):通過接口或抽象類聲明真實角色實現的業務方法。
- 真實角色(Real Subject):實現了抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。
- 代理角色(Proxy):實現了抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,并可以附加自己的操作。
import abc # 抽象角色 class Subject(metaclass=abc.ABCMeta): ? ? @abc.abstractmethod ? ? def get_content(self): ? ? ? ? pass ? ? @abc.abstractmethod ? ? def set_content(self, content): ? ? ? ? pass # 真實角色 class RealSubject(Subject): ? ? def __init__(self, filename): ? ? ? ? self.filename = filename ? ? ? ? f = open(self.filename, "r", encoding="utf-8") ? ? ? ? self.content = f.read() ? ? ? ? print("讀取文件...") ? ? ? ? f.close() ? ? def get_content(self): ? ? ? ? return self.content ? ? def set_content(self, content): ? ? ? ? f = open(self.filename, "w", encoding="utf-8") ? ? ? ? f.write(content) ? ? ? ? f.close() # 虛代理 class VirtualProxy(Subject): ? ? def __init__(self, filename): ? ? ? ? self.filename = filename ? ? ? ? self.subj = None ? ? def get_content(self): ? ? ? ? if not self.subj: ? ? ? ? ? ? self.subj = RealSubject(self.filename) ? ? ? ? return self.subj.get_content() ? ? def set_content(self, content): ? ? ? ? if not self.subj: ? ? ? ? ? ? self.subj = RealSubject(self.filename) ? ? ? ? return self.subj.set_content(content) # 保護代理 class ProtectedProxy(Subject): ? ? def __init__(self, filename): ? ? ? ? self.filename = filename ? ? ? ? self.subj = RealSubject(self.filename) ? ? def get_content(self): ? ? ? ? return self.subj.get_content() ? ? def set_content(self, content): ? ? ? ? raise PermissionError("您的權限不夠!") if __name__ == "__main__": ? ? print("--- RealSubject ---") ? ? subj = RealSubject("test.txt") ? # 在這里就會讀取文件,并占用內存。 ? ? print(subj.get_content()) ? ? #subj.set_content("修改內容...") ? ?? ? ? print("--- VirtualProxy ---") ? ? subj = VirtualProxy("test.txt") ?# 虛代理只有在調用 get_content 時才會讀取文件,并占用內存。 ? ? #print(subj.get_content()) ? ? #subj.set_content("修改內容...") ? ? print("--- ProtectedProxy ---") ? ? subj = ProtectedProxy("test.txt") ? ? #print(subj.get_content()) ? ? #subj.set_content("修改內容...") ?# 保護代理這里不能進行修改,會報錯。
原文鏈接:https://is-cloud.blog.csdn.net/article/details/122930242
相關推薦
- 2022-07-12 微信小程序(條件渲染和列表渲染)
- 2022-08-15 前端el-select下拉數據太長顯示...鼠標浮上去顯示全部
- 2022-12-01 Redis的數據存儲及String類型的實現_Redis
- 2022-08-02 Android自定義Dialog的方法實例_Android
- 2022-08-27 JQuery自定義模態框效果_jquery
- 2022-08-28 failed to configure a datasource: ‘url‘ attribute
- 2023-03-26 使用docker安裝hadoop的實現過程_docker
- 2022-09-29 ASP.NET?MVC實現多選下拉框保存并顯示_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支