首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >来看 Python 如何实现代理模式

来看 Python 如何实现代理模式

作者头像
Wu_Candy
发布2022-07-04 20:47:07
发布2022-07-04 20:47:07
5350
举报
文章被收录于专栏:无量测试之道无量测试之道
这是无量测试之道的第196篇原创
前言

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

代理模式

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

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

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

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

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

代码实现
代码语言:javascript
复制
import time
import datetime
from abc import ABC,abstractmethod


#定义一个User类,用于模拟登录操作
class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def get_user_username(self):
        return self.username

    def get_user_password(self):
        return self.password

1、定义业务抽象接口类

代码语言:javascript
复制
class Bussiness(ABC):
    @abstractmethod
    def request(self):
        pass

    @abstractmethod
    def deal(self):
        pass

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

代码语言:javascript
复制
class Real_Bussiness(Bussiness):
    def request(self,user:User):
        print("核心业务逻辑处理开始")
        #这里只是模拟了先要做一次登录的权限校验验证,对于登录后的逻辑就空缺了,这里只是演示代理模式的原理
        if(self.login(user.get_user_username(),user.get_user_password())):
            self.deal()
        print("核心业务逻辑处理结束")

    def login(self,username,password):
        #这里对于用户的校验我是写死的,一般都是从db中获取是否匹配的
        if username== "admin" and password== "123456":
            print("login is success!!!")
            return True
        else:
            return False

    #此方法是登录后要做的另一个业务场景,这里就不多写了,只是模拟一下
    def deal(self):
        time.sleep(0.5)

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

代码语言:javascript
复制
class Proxy(Bussiness):
    def __init__(self):
        self._rb=Real_Bussiness()

    def request(self,user:User):
        print("开始发送请求")
        start_time=datetime.datetime.now()
        self._rb.request(user)
        end_time=datetime.datetime.now()
        print("请求处理完成")
        print("本次请求共耗时:",end_time-start_time)

    #此方法是登录后要做的另一个业务场景,这里就不多写了,只是模拟一下
    def deal(self):
        time.sleep(0.5)



if __name__ == '__main__':
 user=User("admin","123456")

 #直接调用业务处理逻辑
 rb=Real_Bussiness()
 rb.request(user)
 print("*"*30)
 #通过代理方式来调用业务处理逻辑
 pr=Proxy()
 pr.request(user)
4、输出结果

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

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

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

end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无量测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 这是无量测试之道的第196篇原创
  • 前言
  • 代理模式
  • 代码实现
  • 4、输出结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档