Python筆記之代理模式
代理通常就是一個介于尋求方和提供方之間的中介系統(tǒng)。其核心思想就是客戶端(尋求方)沒有直接和提供方(真實(shí)對象)打交道,而是通過代理對象來完成提供方提供的資源或操作。
代理其實(shí)就是封裝實(shí)際服務(wù)對象的包裝器或代理人。代理可以為其包裝的對象提供附加功能,而無需改變此對象的代碼。代理模式的主要目的是為其他對象提供一個代理者或占位符,從而控制對實(shí)際對象的訪問。
三種常見的不同類型或不同應(yīng)用場景下的代理:
- 虛擬代理:如果一個對象實(shí)例化后會占用大量的內(nèi)存,可以先利用占位符表示,只有當(dāng)客戶端請求或訪問這個對象時才會創(chuàng)建實(shí)際的對象。
- 遠(yuǎn)程代理:給位于遠(yuǎn)程服務(wù)器或不同地址空間上的實(shí)際對象提供了本地表示。例如應(yīng)用程序可能需要獲取不同服務(wù)器或空間地址上的對象信息,這時候就可以通過一個本地的代理來獲取相關(guān)信息,而不需要直接去和各個服務(wù)器或空間地址上的對象“打交道”。
- 保護(hù)代理:通過代理來訪問真正的對象,訪問時,代理則檢查和控制來自客戶端的請求權(quán)限、認(rèn)證、授權(quán)等,從而保護(hù)了真正的實(shí)際對象。
代理模式注意點(diǎn):
- 客戶端實(shí)際上可以直接訪問真實(shí)對象以得到自己想要的結(jié)果,但是使用代理也會有許多優(yōu)勢,就如同它的名字“代理”,是可以進(jìn)行代理的,但是具體的使用還是需要根據(jù)具體情況而定。
- 代理是可以根據(jù)需要在代理的接口中添加額外的操作的,但需要注意的是這些額外的操作不要變成了“累贅”。
- 由于代理相當(dāng)于是給真實(shí)對象進(jìn)行了一層封裝,所以可能會增加一定的耗時。
簡單示例:
from abc import ABCMeta, abstractmethod
class HouseOwner(metaclass=ABCMeta):
"""房主抽象類:都可以將房子出租"""
@abstractmethod
def rent_house(self, rental):
pass
class Landlord(HouseOwner):
"""真實(shí)對象:房主"""
def __init__(self):
self.account = 0
self.house_key = 'house key'
def rent_house(self, rental):
"""收取租金,并房屋鑰匙給出租的人"""
self.account += rental
return self.house_key
class HouseAgent:
"""代理類:中介,代理房東出租他們的房子"""
def __init__(self):
self.account = 0
self.house_resource = []
# 房源肯定不只一個,這里就只簡單放一個了
self.house_resource.append(Landlord())
# 通常而言,代理類和表示真實(shí)對象的類具有相同的接口
# 表示此方法給真實(shí)對象某個操作進(jìn)行的代理操作
def rent_house(self, rental, agency_fee):
"""收取租金和中介費(fèi),并將房子出租給客戶"""
self.account += agency_fee
house_key = self.house_resource[0].rent_house(rental)
return house_key
class Renter:
"""客戶端類:租戶"""
def __init__(self):
self.account = 10000
self.house_key = None
self.house_agent = HouseAgent()
def find_house(self):
"""在某一個中介(代理對象)處出租房子"""
self.house_key = self.house_agent.rent_house(3000, 1000)
print("You've rented a house!")
if __name__ == '__main__':
renter = Renter()
renter.find_house()
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)簡單的獲取圖片爬蟲功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)簡單的獲取圖片爬蟲功能,涉及Python使用urllib模塊及正則模塊操作頁面元素獲取圖片的相關(guān)技巧,需要的朋友可以參考下2017-07-07
對DJango視圖(views)和模版(templates)的使用詳解
今天小編就為大家分享一篇對DJango視圖(views)和模版(templates)的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python+Selenium自動化測試——輸入,點(diǎn)擊操作
這篇文章主要介紹了python+Selenium自動化測試——輸入,點(diǎn)擊操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python中不可變數(shù)據(jù)類型原理與實(shí)戰(zhàn)全解析
在Python的世界里,數(shù)據(jù)對象被明確劃分為兩大陣營:可變(Mutable)與不可變(Immutable),而本文將為大家詳細(xì)介紹一下其中的不可變數(shù)據(jù),感興趣的可以了解下2025-04-04
Python+SymPy實(shí)現(xiàn)秒解微積分詳解
SymPy是一個Python庫,專注于符號數(shù)學(xué),它的目標(biāo)是成為一個全功能的計算機(jī)代數(shù)系統(tǒng),同時保持代碼簡潔、易于理解和擴(kuò)展。本文將利用SymPy實(shí)現(xiàn)四行代碼秒解微積分,感興趣的可以學(xué)習(xí)一下2022-05-05
Python利用cnocr庫實(shí)現(xiàn)pdf文件的文字識別
很多pdf文件文字識別軟件都會收費(fèi),免費(fèi)的網(wǎng)頁版可能會帶來信息泄露,所以本文為大家介紹了如何利用Python中的cnocr庫完成中文掃描pdf文件的文字識別,需要的可以參考下2024-12-12

