Python學習筆記:代理模式

代理一般就是一個介於尋求方和提供方之間的中介系統。其核心思想就是客戶端(尋求方)沒有直接和提供方(真實對象)打交道,而是經過代理對象來完成提供方提供的資源或操做。服務器

代理其實就是封裝實際服務對象的包裝器或代理人。代理能夠爲其包裝的對象提供附加功能,而無需改變此對象的代碼。代理模式的主要目的是爲其餘對象提供一個代理者或佔位符,從而控制對實際對象的訪問。app

三種常見的不一樣類型或不一樣應用場景下的代理:spa

  • 虛擬代理:若是一個對象實例化後會佔用大量的內存,能夠先利用佔位符表示,只有當客戶端請求或訪問這個對象時纔會建立實際的對象。
  • 遠程代理:給位於遠程服務器或不一樣地址空間上的實際對象提供了本地表示。例如應用程序可能須要獲取不一樣服務器或空間地址上的對象信息,這時候就能夠經過一個本地的代理來獲取相關信息,而不須要直接去和各個服務器或空間地址上的對象「打交道」。
  • 保護代理:經過代理來訪問真正的對象,訪問時,代理則檢查和控制來自客戶端的請求權限、認證、受權等,從而保護了真正的實際對象。

代理模式注意點:代理

  • 客戶端實際上能夠直接訪問真實對象以獲得本身想要的結果,可是使用代理也會有許多優點,就如同它的名字「代理」,是能夠進行代理的,可是具體的使用仍是須要根據具體狀況而定。
  • 代理是能夠根據須要在代理的接口中添加額外的操做的,但須要注意的是這些額外的操做不要變成了「累贅」。
  • 因爲代理至關因而給真實對象進行了一層封裝,因此可能會增長必定的耗時。

簡單示例:code

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()
相關文章
相關標籤/搜索