结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。python
因为组合关系或聚合关系比继承关系耦合度低,知足“合成复用原则”,因此对象结构型模式比类结构型模式具备更大的灵活性。安全
在有些状况下,一个客户不能或者不想直接访问另外一个对象,这时须要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不必定要去火车站买,能够经过 12306 网站或者去火车票代售点买。服务器
代理模式的定义:因为某些缘由须要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象做为访问对象和目标对象之间的中介。布局
代理模式的主要优势有:post
其主要缺点是:性能
代理模式的结构比较简单,主要是经过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问,下面来分析其基本结构和实现方法。网站
代理模式的主要角色以下:spa
class Subject(object): ''' 抽象主题 ''' def request(self): pass class RealSubject(Subject): def request(self): print("访问真实主题类") class Proxy(Subject): __real_subject = None def request(self): if self.__real_subject is None: self.__real_subject = RealSubject() self.pre_request() self.__real_subject.request() self.aft_request() def pre_request(self): print("访问真实主题以前的预处理。") def aft_request(self): print("访问真实主题以后的后续处理。") if __name__ == '__main__': p = Proxy() p.request()
访问真实主题以前的预处理。 访问真实主题类 访问真实主题以后的后续处理。
【例1】韶关“天街e角”公司是一家婺源特产公司的代理公司,用代理模式实现。设计
分析:本实例中的“婺源特产公司”经营许多婺源特产,它是真实主题,提供了显示特产的 display() 方法。而韶关“天街e角”公司是婺源特产公司特产的代理,经过调用婺源特产公司的 display() 方法显示代理产品,固然它能够增长一些额外的处理,如包裝或加价等。客户可经过“天街e角”代理公司间接访问“婺源特产公司”的产品,图所示是公司的结构图。代理
class Specially(object): def display(self): pass class RealSpecially(Specially): def display(self): print("“婺源特产公司”经营许多婺源特产") class SgProxy(Specially): __real_specially = None def display(self): if self.__real_specially is None: self.__real_specially = RealSpecially() self.pre_opt() self.__real_specially.display() self.post_opt() def pre_opt(self): print("代理商打包") def post_opt(self): print("代理商发货") if __name__ == '__main__': sp = SgProxy() sp.display()
代理商打包 “婺源特产公司”经营许多婺源特产 代理商发货
前面分析了代理模式的结构与特色,如今来分析如下的应用场景。
在前面介绍的代理模式中,代理类中包含了对真实主题的引用,这种方式存在两个缺点。