今天来学习一下代理模式, 代理模式的特点是,不会直接访问真正的对象,而是访问代理对象,从而间接访问到我们真正的对象。所以可以做文章的地方,就是代理对象。
代理对象一般会分为保护性代理,延迟性代理,引用代理。
- 保护性代理,在我们访问到真正对象之前,会进行一些鉴权操作,或者屏蔽到一些敏感属性。
- 延迟性代理,延迟性代理的目标是节约资源,变量在访问的时候,才会进行设置,一定程度上节约了内存资源
- 引用代理,在访问到真正对象之前或者之后,做一些其余的操作,比如计数,计时等,达到了丰富对象的作用
举例子
下面以保护性代理和延迟性代理举例
# @Time : 2022/10/13 13:14
# @Author : han an min
# @File : ProxyModel.py
# @Software: PyCharm
class CoconutMilkInfo:
def __init__(self):
self.data = "这是重要的椰奶资料,修改需要密码"
def read(self):
return self.data
def reset(self, content):
self.data = content
class ProtectInfo:
"""
保护性代理
用于数据安全的场景
"""
def __init__(self):
self.__cm_info = CoconutMilkInfo()
def read(self):
return self.__cm_info.data
def reset(self, content):
sec = input("请输入密码")
if sec == "123":
self.__cm_info.data = content
else:
print("你的密码不对,不允许更改")
class LazyProxy:
"""
延迟代理
懒加载
"""
def __init__(self, method):
self.method = method
self._method_name = method.__name__
def __get__(self, obj, cls):
if not obj:
return None
value = self.method(obj)
setattr(obj, self._method_name, value)
return value
class CoconutMilkData:
def __init__(self):
self.name = "椰奶资料"
self._data = None
@LazyProxy
def data(self):
print("进行懒加载>>")
self._data = "懒加载后的数据"
return self._data
if __name__ == "__main__":
print(">> 保护数据的Proxy =>>")
pro_proxy = ProtectInfo()
print(pro_proxy.read())
pro_proxy.reset("123")
print(pro_proxy.read())
print(">> 懒加载数据的Proxy =>>")
cm_data = CoconutMilkData()
print(cm_data.name)
print(cm_data.data)
print(cm_data.data)
运行结果 >>