zoukankan      html  css  js  c++  java
  • Python 设计模式—代理模式

    前言


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

    代理模式


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

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

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

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

    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

    欢迎关注【无量测试之道】公众号,回复【领取资源】
    Python编程学习资源干货、
    Python+Appium框架APP的UI自动化、
    Python+Selenium框架Web的UI自动化、
    Python+Unittest框架API自动化、

    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

     

     添加关注,让我们一起共同成长!

  • 相关阅读:
    关于上传组件
    二分查找的时间复杂度
    commander.js
    执行上下文
    谷歌插件开发
    网站性能
    日记
    <<人间失格>>阅读
    Node.js 应该用在什么地方
    浅谈前后端分离与实践 之 nodejs 中间层服务
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/14791007.html
Copyright © 2011-2022 走看看