# 模式类型:结构性模型
# 模型方法:动态代理模式
# 作用:相对于静态代理,动态代理更灵活。不需要手动实现接口类中的所有方法,接口新增方法后动态代理无需修改。
# 使用场景:监控。日志,限流
from abc import ABCMeta, abstractmethod
import types
class ITeacher(metaclass=ABCMeta):
"""教师接口"""
@abstractmethod
def teach(self):
pass
class ProxyFactory():
target = None
def __init__(self, target):
self.target = target
def __getattr__(self, item):
# 使用反射动态生成代理函数
if hasattr(self.target, item):
attr = getattr(self.target, item)
if isinstance(attr, types.MethodType):
def method(*args, **kwargs):
print("课前准备工作")
attr(*args, **kwargs)
print("课后结尾工作")
return method
else:
return attr
else:
raise AttributeError("%s object has not attr %s" % (self.target.__class__.__name__, item))
class TeacherLi(ITeacher):
def teach(self):
print("李老师讲课")
if __name__ == "__main__":
# 创建目标对象
li_teacher = TeacherLi()
# 创建代理对象,并将被代理对象传给代理对象
teacher_proxy = ProxyFactory(li_teacher)
# 通过代理对象,调用被代理对象方法
teacher_proxy.teach()