代理一般就是一个介于寻求方和提供方之间的中介系统。其核心思想就是客户端(寻求方)没有直接和提供方(真实对象)打交道,而是经过代理对象来完成提供方提供的资源或操做。服务器
代理其实就是封装实际服务对象的包装器或代理人。代理能够为其包装的对象提供附加功能,而无需改变此对象的代码。代理模式的主要目的是为其余对象提供一个代理者或占位符,从而控制对实际对象的访问。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()