Python设计模式-代理模式

Python设计模式-代理模式

基于Python3.5.2,代码如下
#coding:utf-8

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)

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 dict"
        addr = info.get("addr",0)
        if not addr in self.white_list:
            return "Your address is not in whiteList"
        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 = []

if __name__ == "__main__":
    info_struct = dict()
    info_struct["addr"] = 10010
    info_struct["content"] = "Hello World"
    info_server = infoServer()
    white_server_proxy = whiteInfoServerProxy(info_server)
    print(white_server_proxy.recv(info_struct))
    white_server_proxy.show()
    white_server_proxy.addWhite(10010)
    print(white_server_proxy.recv(info_struct))
    white_server_proxy.show()

代理模式分析与解读

代理模式

为某对象提供一个代理,以控制对此对象的访问和控制。代理模式在使用过程中,应尽量对抽象主题类进行代理,而尽量不要对加过修饰和方法的子类代理。

代理模式的适用场景

1、针对某特定对象进行功能和增强性扩展。如IP防火墙、远程访问代理等技术的应用;
2、对主题对象进行保护。如大流量代理,安全代理等;
3、减轻主题对象负载。如权限代理等。
4、为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
5、根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真是对象。
6、用来控制真是对象访问的权限。一般用于对象应该有不同的访问权限的是后。
7、在调用真是对象时,代理处理另外一些事。

解读

在代理模式中,需要隐藏真正提供服务的对象,通过代理对象来间接调用服务对象。
1.先定义好真正提供服务的对象infoServer,并提供recv(),send(),show()三个方法。
2.定义好代理类infoServerProxy,当初始化代理类的时候,将需要提供服务的infoServer对象传入,在实现infoServerProxy的三个方法recv(),send(),show()时,分别调用infoServer对象对应的方法,此时就实现了由代理提供对外接口服务,真正执行由隐藏的服务对象执行。
3.在whiteInfoServerProxy类中,又对代理对象进行了recv方法的封装,当调用whiteInfoServerProxy.recv()方法时,会先对是否调用服务对象的recv()方法进行判断,如果在white_list中能够找到IP则执行服务对象的recv()方法。

程序运行结果如下:

Your address is not in whiteList
SHOW:
recv OK:
SHOW:Hello World

当10010不在白名单里面的时候,返回的是Your address is not in whiteList;当白名单中有10010时,则执行成功recv OK:

代理模式的优缺点:

优点:
1.职责清晰:非常符合单一职责原则,主题对象实现真实业务逻辑,而非本职责的事务,交由代理完成;
2.扩展性强:面对主题对象可能会有的改变,代理模式在不改变对外接口的情况下,可以实现最大程度的扩展;
3.保证主题对象的处理逻辑:代理可以通过检查参数的方式,保证主题对象的处理逻辑输入在理想范围内。
缺点:
1.可能会降低整体业务的处理效率和速度。

备注:

在代理模式的通用写法可归结如下:
class Subject():
    def request(self):
        raise NotImplementedError

class RealSubject(Subject):
    def request(self):
        print("真实请求")

class Proxy(Subject):
    def __init__(self):
        self.__realSubject = RealSubject()
    def request(self):
        self.__realSubject.request()

if __name__ == "__main__":
    # 客户端调用
    proxy = Proxy()
    proxy.request()
该实现方式,更具有通用性,更适用于用不同语言对代理模式的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值