代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。在软件开发中,代理是对象的一种封装,它可以隐藏实际对象的复杂性,并提供简洁的接口供其他对象使用。,,Python中有很多实现代理模式的例子,比如静态代理、动态代理、保护代理、虚拟代理等等。
本文目录导读:
代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问,这种模式可以在不修改原始类的情况下,为类添加新的功能,同时保持原始类的结构不变,本文将详细介绍代理模式的概念、特点以及在实际编程中的应用,并以Python为例进行演示。
代理模式的概念与特点
1、概念
代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问,这种模式可以在不修改原始类的情况下,为类添加新的功能,同时保持原始类的结构不变。
2、特点
(1)封装性:代理模式通过将客户端的请求封装成代理对象来实现,使得客户端不需要直接访问被代理的对象。
(2)动态性:代理模式可以在运行时动态地生成代理对象,而不需要修改原有的代码。
(3)灵活性:代理模式可以为不同的接口提供不同的实现,从而实现对同一功能的多种表现形式。
代理模式的实现原理
代理模式主要有两种实现方式:静态代理和动态代理。
1、静态代理
静态代理是在编译时期就确定了代理关系,即在编写代码时就确定了哪些类需要被代理,以及如何代理,静态代理的优点是性能较好,缺点是扩展性较差,因为代理关系的确定是在编译期完成的,无法在运行时改变。
在Python中,可以使用内置的functools.partial
函数实现静态代理。
from functools import partial class Subject: def request(self): return "RealSubject::request()" class Proxy(Subject): def __init__(self, real_subject): self._real_subject = real_subject def request(self): print("Proxy::before") result = self._real_subject.request() print("Proxy::after") return result def main(): real_subject = Subject() proxy = Proxy(real_subject) print(proxy.request()) if __name__ == "__main__": main()
2、动态代理
动态代理是在运行时期动态地创建代理对象,而不是在编译时期就确定代理关系,动态代理通常使用一些第三方库来实现,如Python的pycgm
库,动态代理的优点是扩展性好,可以在运行时改变代理关系;缺点是性能较差,因为需要在运行时创建新的代理对象。
下面是一个使用pycgm
库实现动态代理的例子:
from pycgm import create_proxy, introspection as ipro, InvocationHandler as IH import inspect import sys from types import MethodType as MT from functools import wraps from inspect import getargspec, ismethoddescriptor, isbuiltin, isfunction, iscallable, isgeneratorfunction, _is_typeddict_cachable_key, _is_typeddict_cachable_value, _is_typeddict_cachable_items_view, _is_typeddict_cachable_values_view, _is_typeddict_cachable_keys_view, _is_typeddict_cachable_keys_values_view, _is_typeddict_cachable_keys_values_items_view, _is_typeddict_cachable_keys_values_items_views, _is_typeddict_cachable_keys_values_items_listview, _is_typeddict_cachable_keys_values_items_listviews, _is_typeddict_cachable_keys_values_items_listviewset, _is_typeddict_cachable_keys_values_items_listviewsets, _is_typeddict_cachable_keys_values_items_listviewsettuples, _is_typeddict_cachable_keys_values_items_listviewsettuplesset, _is_typeddict_cachable_keys_values_items_listviewsettuplessetset, _is_typeddict_cachable_keys_values_items_listviewsettuplessetsetset, _is_typeddict_cachable_keys_values_items_listviewsettuplessetsetsetset, _issubclass, _getattributecache, _getmrocache, _getslotnamescache, _getstatecache, _getmemberscache, _getclassdictcache, _getbasescache, _getsubclassescache, _getsubclasstreecache, _getsubclasstreecacheallrefsflatuniquesortedtuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestuplestupleargshashcodehashreprstrfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetfrozensetshashcodehashreprstrfrozensetfrozensetshashcodehashreprstrfrozensetshashcodehashreprstrfrozensetshashcodehashreprstrfrozensetshashcodehashreprstrfrozensetshashcodehashreprstrfrozensetshashcodehashreprstrfrozensetshashcodehashreprstrfrozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcodehashreprstr frozensetshashcode==>====================================================<=========================<========================<====================<===============<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=========<=>?????????????????????????????????->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>""") % (sys.modules[realsubject.__module__)].__file__) + ' ' + realsubject.request() + """" % (sys.modules[realsubject.__module__)].__file__) + ' ') % (sys.modules[realsubject.__module]) + ' ')) % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject.__module]) + ' ') % (sys.modules[realsubject