代理通常就是一個介於尋求方和提供方之間的中介系統。其核心思想就是客戶端(尋求方)沒有直接和提供方(真實對象)打交道,而是通過代理對象來完成提供方提供的資源或操作。 代理其實就是封裝實際服務對象的包裝器或代理人。代理可以為其包裝的對象提供附加功能,而無需改變此對象的代碼。代理模式的主要目的是為其他對象 ...
代理通常就是一個介於尋求方和提供方之間的中介系統。其核心思想就是客戶端(尋求方)沒有直接和提供方(真實對象)打交道,而是通過代理對象來完成提供方提供的資源或操作。
代理其實就是封裝實際服務對象的包裝器或代理人。代理可以為其包裝的對象提供附加功能,而無需改變此對象的代碼。代理模式的主要目的是為其他對象提供一個代理者或占位符,從而控制對實際對象的訪問。
三種常見的不同類型或不同應用場景下的代理:
- 虛擬代理:如果一個對象實例化後會占用大量的記憶體,可以先利用占位符表示,只有當客戶端請求或訪問這個對象時才會創建實際的對象。
- 遠程代理:給位於遠程伺服器或不同地址空間上的實際對象提供了本地表示。例如應用程式可能需要獲取不同伺服器或空間地址上的對象信息,這時候就可以通過一個本地的代理來獲取相關信息,而不需要直接去和各個伺服器或空間地址上的對象“打交道”。
- 保護代理:通過代理來訪問真正的對象,訪問時,代理則檢查和控制來自客戶端的請求許可權、認證、授權等,從而保護了真正的實際對象。
代理模式註意點:
- 客戶端實際上可以直接訪問真實對象以得到自己想要的結果,但是使用代理也會有許多優勢,就如同它的名字“代理”,是可以進行代理的,但是具體的使用還是需要根據具體情況而定。
- 代理是可以根據需要在代理的介面中添加額外的操作的,但需要註意的是這些額外的操作不要變成了“累贅”。
- 由於代理相當於是給真實對象進行了一層封裝,所以可能會增加一定的耗時。
簡單示例:
from abc import ABCMeta, abstractmethod class HouseOwner(metaclass=ABCMeta): """房主抽象類:都可以將房子出租""" @abstractmethod def rent_house(self, rental): pass class Landlord(HouseOwner): """真實對象:房主""" 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()) # 通常而言,代理類和表示真實對象的類具有相同的介面 # 表示此方法給真實對象某個操作進行的代理操作 def rent_house(self, rental, agency_fee): """收取租金和中介費,並將房子出租給客戶""" 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()