標籤:ict 保留 功能 prot 額外 python ima 代理模式 針對
說明:
模式動機 通過引入一個新的對象(如小圖片和遠程代理對象)來實現對真實對象的操作或者將新的對象作為真實對象的一個替身,這種實現機制即為代理模式,通過引入代理對象來間接訪問一個對象,這就是代理模式的模式動機。
常見的有:分析 代購商品:顧客 ->代購網站 -> 商品 , 軟體開發:用戶端 -> 代理對象-> 真實對象。用戶端通過一個代理對象來實現對真是對象的訪問。
代理模式:給某一個對象提供一個代理或預留位置,並由代理對象來控制對原對象的訪問。
代理模式的定義 引入一個新的代理對象 代理對象在用戶端對象和目標對象之間起到中介的作用 去掉客戶不能看到的內容和服務或者增添客戶需要的額外的新服務
代理模式的結構
代理模式包含以下3個角色: Subject(抽象主題角色) Proxy(代理主題角色) RealSubject(真實主題角色)
執行個體:
#構建一個伺服器,該伺服器接受如下格式資料,addr代表地址,content代表接收的資訊內容info_struct=dict()info_struct["addr"]=10000info_struct["content"]=""class Server: content="" def recv(self,info): pass def send(self,info): pass def show(self): passclass infoServer(Server): def recv(self,info): self.content=info return "recv OK!" def send(self,info): pass def show(self): print("SHOW:%s"%self.content)"""infoServer有接收和發送的功能,發送功能由於暫時用不到,保留。另外新加一個介面show,用來展示伺服器接收的內容。接收的資料格式必須如info_struct所示,伺服器僅接受info_struct的content欄位。那麼,如何給這個伺服器設定一個白名單,使得只有白名單裡的地址可以訪問伺服器呢?修改Server結構是個方法,但這顯然不符合軟體設計原則中的單一職責原則。在此基礎之上,使用代理,是個不錯的方法。代理配置如下"""class serverProxy: passclass infoServerProxy(serverProxy): server="" def __init__(self,server): self.server=server def recv(self,info): return self.server.recv(info) def show(self): self.server.show()class whiteInfoServerProxy(infoServerProxy): white_list=[] def recv(self,info): try: assert type(info)==dict except: return "info structure is not correct" addr=info.get("addr",0) if not addr in self.white_list: return "Your address is not in the white list." else: content=info.get("content","") return self.server.recv(content) def addWhite(self,addr): self.white_list.append(addr) def rmvWhite(self,addr): self.white_list.remove(addr) def clearWhite(self): self.white_list=[]"""代理中有一個server欄位,控制代理的伺服器對象,infoServerProxy充當Server的直接介面代理,而whiteInfoServerProxy直接繼承了infoServerProxy對象,同時加入了white_list和對白名單的操作。這樣,在情境中通過對白名單代理的訪問,就可以實現伺服器的白名單訪問了。"""if __name__=="__main__": info_struct = dict() info_struct["addr"] = 10010 info_struct["content"] = "Hello World!" info_server = infoServer() info_server_proxy = whiteInfoServerProxy(info_server) print(info_server_proxy.recv(info_struct)) info_server_proxy.show() info_server_proxy.addWhite(10010) print(info_server_proxy.recv(info_struct)) info_server_proxy.show()
列印結果:
Your address is not in the white list.
SHOW:
recv OK!
SHOW:Hello World!
幾種常見的代理模式
遠程代理(Remote Proxy):為一個位於不同的地址空間的對象提供一個本地的代理對象,這個不同的地址空間可以在同一台主機中,也可以在另一台主機中,遠程代理又稱為大使(Ambassador)
虛擬代理(Virtual Proxy):如果需要建立一個資源消耗較大的對象,先建立一個消耗相對較小的對象來表示,真實對象只在需要時才會被真正建立
保護代理(Protect Proxy):控制對一個對象的訪問,可以給不同的使用者提供不同層級的使用許可權
緩衝代理(Cache Proxy):為某一個目標操作的結果提供臨時的儲存空間,以便多個用戶端可以共用這些結果
智能引用代理(Smart Reference Proxy):當一個對象被引用時,提供一些額外的操作,例如將對象被調用的次數記錄下來等
模式優點
能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度 用戶端可以針對抽象主題角色進行編程,增加和更換代理類無須修改原始碼,符合開閉原則,系統具有較好的靈活性和可擴充性
模式缺點
由於在用戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢(例如保護代理) 實現代理模式需要額外的工作,而且有些代理模式的實現過程較為複雜(例如遠程代理)
模式適用環境
當用戶端對象需要訪問遠程主機中的對象時可以使用遠程代理 當需要用一個消耗資源較少的對象來代表一個消耗資源較多的對象,從而降低系統開銷、縮短已耗用時間時可以使用虛擬代理 當需要為某一個被頻繁訪問的操作結果提供一個臨時儲存空間,以供多個用戶端共用訪問這些結果時可以使用緩衝代理 當需要控制對一個對象的訪問,為不同使用者提供不同層級的存取權限時可以使用保護代理 當需要為一個對象的訪問(引用)提供一些額外的操作時可以使用智能引用代理
參考連結:https://yq.aliyun.com/articles/70738?spm=a2c4e.11155435.0.0.70711a1cGSkn9j
python-代理模式