• python-代理模式


    源码地址:https://github.com/weilanhanf/PythonDesignPatterns

    说明:

    模式动机 通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。

    常见的有:分析 代购商品:顾客 ->代购网站 -> 商品 ,  软件开发:客户端 -> 代理对象-> 真实对象。客户端通过一个代理对象来实现对真是对象的访问。

    代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。

    代理模式的定义 引入一个新的代理对象 代理对象在客户端对象和目标对象之间起到中介的作用 去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务

    代理模式的结构

    代理模式包含以下3个角色: Subject(抽象主题角色) Proxy(代理主题角色) RealSubject(真实主题角色)

    实例:

    #构建一个服务器,该服务器接受如下格式数据,addr代表地址,content代表接收的信息内容
    info_struct=dict()
    info_struct["addr"]=10000
    info_struct["content"]=""
    class Server:
        content=""
        def recv(self,info):
            pass
        def send(self,info):
            pass
        def show(self):
            pass
    class infoServer(Server):
        def recv(self,info):
            self.content=info
            return "recv OK!"
        def send(self,info):
            pass
        def show(self):
            print("SHOW:%s"%self.content)
    
    """
    infoServer有接收和发送的功能,发送功能由于暂时用不到,保留。
    另外新加一个接口show,用来展示服务器接收的内容。
    接收的数据格式必须如info_struct所示,服务器仅接受info_struct的content字段。
    那么,如何给这个服务器设置一个白名单,使得只有白名单里的地址可以访问服务器呢?
    修改Server结构是个方法,但这显然不符合软件设计原则中的单一职责原则。
    在此基础之上,使用代理,是个不错的方法。代理配置如下
    """
    
    
    class serverProxy:
        pass
    class infoServerProxy(serverProxy):
        server=""
        def __init__(self,server):
            self.server=server
        def recv(self,info):
            return self.server.recv(info)
        def show(self):
            self.server.show()
    
    class whiteInfoServerProxy(infoServerProxy):
        white_list=[]
        def recv(self,info):
            try:
                assert type(info)==dict
            except:
                return "info structure is not correct"
            addr=info.get("addr",0)
            if not addr in self.white_list:
                return "Your address is not in the white list."
            else:
                content=info.get("content","")
                return self.server.recv(content)
        def addWhite(self,addr):
            self.white_list.append(addr)
        def rmvWhite(self,addr):
            self.white_list.remove(addr)
        def clearWhite(self):
            self.white_list=[]
    
    """
    代理中有一个server字段,控制代理的服务器对象,infoServerProxy充当Server的直接接口代理,
    而whiteInfoServerProxy直接继承了infoServerProxy对象,同时加入了white_list和对白名单的操作。
    这样,在场景中通过对白名单代理的访问,就可以实现服务器的白名单访问了。
    """
    
    if  __name__=="__main__":
        info_struct = dict()
        info_struct["addr"] = 10010
        info_struct["content"] = "Hello World!"
        info_server = infoServer()
        info_server_proxy = whiteInfoServerProxy(info_server)
        print(info_server_proxy.recv(info_struct))
        info_server_proxy.show()
        info_server_proxy.addWhite(10010)
        print(info_server_proxy.recv(info_struct))
        info_server_proxy.show()

    打印结果:

    Your address is not in the white list.
    SHOW:
    recv OK!
    SHOW:Hello World!

    几种常见的代理模式

    远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以在同一台主机中,也可以在另一台主机中,远程代理又称为大使(Ambassador)

    虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建

    保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限

    缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果

    智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等

    模式优点

    能够协调调用者和被调用者,在一定程度上降低了系统的耦合度 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性

    模式缺点

    由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢(例如保护代理) 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂(例如远程代理)

    模式适用环境

    当客户端对象需要访问远程主机中的对象时可以使用远程代理 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理

    参考链接:https://yq.aliyun.com/articles/70738?spm=a2c4e.11155435.0.0.70711a1cGSkn9j

  • 相关阅读:
    Java 开发必装的 IntelliJ IDEA 插件
    paoding-rose 之 maven配置
    jetty之maven配置
    paoding rose controller包及文件名命名规则
    PowerMock进行mock测试
    谈谈我的windows服务器运维管理
    谈谈RPC中的异步调用设计
    系统:WSL(win10的子系统Linux)
    信息安全攻防基础
    线性规划计算工具Lingo
  • 原文地址:https://www.cnblogs.com/welan/p/9128541.html
Copyright © 2020-2023  润新知