日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python設計模式結構型代理模式_python

作者:范桂颶 ? 更新時間: 2022-04-20 編程語言

一、代理模式

代理模式,為其他對象提供一種代理,以此控制一個對象的訪問方式。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。

二、應用場景

遠程(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

欄目分類
最近更新