前言
前期分享过几篇关于 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:
8 def __init__(self, username, password):
9 self.username = username
10 self.password = password
11
12 def get_user_username(self):
13 return self.username
14
15 def get_user_password(self):
16 return self.password
1、定义业务抽象接口类
1class Bussiness(ABC):
2 @abstractmethod
3 def request(self):
4 pass
5
6 @abstractmethod
7 def deal(self):
8 pass
2、定义核心业务逻辑类,来现实Bussiness的抽象类定义的逻辑
1class Real_Bussiness(Bussiness):
2 def request(self,user:User):
3 print("核心业务逻辑处理开始")
4 #这里只是模拟了先要做一次登录的权限校验验证,对于登录后的逻辑就空缺了,这里只是演示代理模式的原理
5 if(self.login(user.get_user_username(),user.get_user_password())):
6 self.deal()
7 print("核心业务逻辑处理结束")
8
9 def login(self,username,password):
10 #这里对于用户的校验我是写死的,一般都是从db中获取是否匹配的
11 if username== "admin" and password== "123456":
12 print("login is success!!!")
13 return True
14 else:
15 return False
16
17 #此方法是登录后要做的另一个业务场景,这里就不多写了,只是模拟一下
18 def deal(self):
19 time.sleep(0.5)
3、定义 proxy 代理类,将业务请求转发给业务类,并在业务处理前中后做一些额外的处理比如:增加日志的输出,增加处理的时长等
1class Proxy(Bussiness):
2 def __init__(self):
3 self._rb=Real_Bussiness()
4
5 def request(self,user:User):
6 print("开始发送请求")
7 start_time=datetime.datetime.now()
8 self._rb.request(user)
9 end_time=datetime.datetime.now()
10 print("请求处理完成")
11 print("本次请求共耗时:",end_time-start_time)
12
13 #此方法是登录后要做的另一个业务场景,这里就不多写了,只是模拟一下
14 def deal(self):
15 time.sleep(0.5)
16
17
18
19if __name__ == '__main__':
20 user=User("admin","123456")
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.514653