python-代理模式

來源:互聯網
上載者:User

標籤: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-代理模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.