结构型模式-动态代理模式

# 模式类型:结构性模型
# 模型方法:动态代理模式
# 作用:相对于静态代理,动态代理更灵活。不需要手动实现接口类中的所有方法,接口新增方法后动态代理无需修改。
# 使用场景:监控。日志,限流

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()

  

posted @ 2023-06-26 17:46  你看起来真的很好吃  阅读(2)  评论(0编辑  收藏  举报