Python设计模式_代理模式

前言

前期分享过几篇关于 Python 实现各种设计模式的文章,包含:观察者模式:Python设计模式:观察者模式原型模式:Python设计模式:原型模式门面模式:Python设计模式:门面模式工厂方法模式:Python设计模式:工厂方法模式简单工厂模式:Python设计模式:简单工厂模式今天继续给大家分享设计模式的内容,今天的主题是:Python 如何实现代理模式。

代理模式

1、定义提到代理这个词汇,应该很多人都不陌生,甚至会有很多人用过。互联网的我们,应该接触的比较多的代理主要是在网络通信方面。

例如:我们不能直接访问Google、Facebook 等网站,但是可以通过搭建代理服务器的方式实现我们所用的网络与目标主机之间的通信,这就是网络中代理的概念。

其实用一句话来概括代理的含义就是:允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。

或者是指一个介于寻求方和提供方之间的中介系统或者说是一种模式。

2、使用场景代理模式使用的场景比较多,例如:1.它能够以更简单的方式表示一个复杂的系统。2.它可以使实际对象的安全性更高。3.它可以为不同服务器上的远程对象提供本地的接口。4.它可以为消耗大量内存的对象提供一个轻量级的句柄。

代码实现

1import time 2import datetime 3from abc import ABC,abstractmethod 4 5 6#定义一个User类,用于模拟登录操作 7class User: 8def __init__(self, username, password): 9self.username = username 10self.password = password 11 12def get_user_username(self): 13return self.username 14 15def get_user_password(self): 16return self.password

1、定义业务抽象接口类

1class Bussiness(ABC): 2@abstractmethod 3def request(self): 4pass 5 6@abstractmethod 7def deal(self): 8pass

2、定义核心业务逻辑类,来现实Bussiness的抽象类定义的逻辑

1class Real_Bussiness(Bussiness): 2def request(self,user:User): 3print("核心业务逻辑处理开始") 4#这里只是模拟了先要做一次登录的权限校验验证,对于登录后的逻辑就空缺了,这里只是演示代理模式的原理 5if(self.login(user.get_user_username(),user.get_user_password())): 6self.deal() 7print("核心业务逻辑处理结束") 8 9def login(self,username,password): 10#这里对于用户的校验我是写死的,一般都是从db中获取是否匹配的 11if username== "admin" and password== "": 12print("login is success!!!") 13return True 14else: 15return False 16 17#此方法是登录后要做的另一个业务场景,这里就不多写了,只是模拟一下 18def deal(self): 19time.sleep(0.5)

3、定义 proxy 代理类,将业务请求转发给业务类,并在业务处理前中后做一些额外的处理比如:增加日志的输出,增加处理的时长等

1class Proxy(Bussiness): 2def __init__(self): 3self._rb=Real_Bussiness() 4 5def request(self,user:User): 6print("开始发送请求") 7start_time=datetime.datetime.now() 8self._rb.request(user) 9end_time=datetime.datetime.now() 10print("请求处理完成") 11print("本次请求共耗时:",end_time-start_time) 12 13#此方法是登录后要做的另一个业务场景,这里就不多写了,只是模拟一下 14def deal(self): 15time.sleep(0.5) 16 17 18 19if __name__ == __main__: 20 user=User("admin","") 21 22 #直接调用业务处理逻辑 23 rb=Real_Bussiness() 24 rb.request(user) 25 print("*"*30) 26 #通过代理方式来调用业务处理逻辑 27 pr=Proxy() 28 pr.request(user)

4、输出结果

本次处理的输出结果是( print 结果):

核心业务逻辑处理开始login is success!!!核心业务逻辑处理结束

开始发送请求核心业务逻辑处理开始login is success!!!核心业务逻辑处理结束请求处理完成本次请求共耗时:0:00:00.