Python笔记之代理模式


Posted in Python onNovember 20, 2019

代理通常就是一个介于寻求方和提供方之间的中介系统。其核心思想就是客户端(寻求方)没有直接和提供方(真实对象)打交道,而是通过代理对象来完成提供方提供的资源或操作。

代理其实就是封装实际服务对象的包装器或代理人。代理可以为其包装的对象提供附加功能,而无需改变此对象的代码。代理模式的主要目的是为其他对象提供一个代理者或占位符,从而控制对实际对象的访问。

三种常见的不同类型或不同应用场景下的代理:

  • 虚拟代理:如果一个对象实例化后会占用大量的内存,可以先利用占位符表示,只有当客户端请求或访问这个对象时才会创建实际的对象。
  • 远程代理:给位于远程服务器或不同地址空间上的实际对象提供了本地表示。例如应用程序可能需要获取不同服务器或空间地址上的对象信息,这时候就可以通过一个本地的代理来获取相关信息,而不需要直接去和各个服务器或空间地址上的对象“打交道”。
  • 保护代理:通过代理来访问真正的对象,访问时,代理则检查和控制来自客户端的请求权限、认证、授权等,从而保护了真正的实际对象。

代理模式注意点:

  • 客户端实际上可以直接访问真实对象以得到自己想要的结果,但是使用代理也会有许多优势,就如同它的名字“代理”,是可以进行代理的,但是具体的使用还是需要根据具体情况而定。
  • 代理是可以根据需要在代理的接口中添加额外的操作的,但需要注意的是这些额外的操作不要变成了“累赘”。
  • 由于代理相当于是给真实对象进行了一层封装,所以可能会增加一定的耗时。

简单示例:

from abc import ABCMeta, abstractmethod


class HouseOwner(metaclass=ABCMeta):
  """房主抽象类:都可以将房子出租"""
  @abstractmethod
  def rent_house(self, rental):
    pass


class Landlord(HouseOwner):
  """真实对象:房主"""
  def __init__(self):
    self.account = 0
    self.house_key = 'house key'

  def rent_house(self, rental):
    """收取租金,并房屋钥匙给出租的人"""
    self.account += rental
    return self.house_key


class HouseAgent:
  """代理类:中介,代理房东出租他们的房子"""
  def __init__(self):
    self.account = 0
    self.house_resource = []
    # 房源肯定不只一个,这里就只简单放一个了
    self.house_resource.append(Landlord())

  # 通常而言,代理类和表示真实对象的类具有相同的接口
  # 表示此方法给真实对象某个操作进行的代理操作
  def rent_house(self, rental, agency_fee):
    """收取租金和中介费,并将房子出租给客户"""
    self.account += agency_fee
    house_key = self.house_resource[0].rent_house(rental)
    return house_key


class Renter:
  """客户端类:租户"""
  def __init__(self):
    self.account = 10000
    self.house_key = None
    self.house_agent = HouseAgent()

  def find_house(self):
    """在某一个中介(代理对象)处出租房子"""
    self.house_key = self.house_agent.rent_house(3000, 1000)
    print("You've rented a house!")


if __name__ == '__main__':
  renter = Renter()
  renter.find_house()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python fileinput模块使用介绍
Nov 30 Python
详解Python中DOM方法的动态性
Apr 11 Python
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 Python
Python内建数据结构详解
Feb 03 Python
Python使用pymysql小技巧
Jun 04 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
Python使用装饰器模拟用户登陆验证功能示例
Aug 24 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
Python sorted对list和dict排序
Jun 09 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 #Python
Python笔记之观察者模式
Nov 20 #Python
django 实现celery动态设置周期任务执行时间
Nov 19 #Python
python调用接口的4种方式代码实例
Nov 19 #Python
Python Django2.0集成Celery4.1教程
Nov 19 #Python
通过celery异步处理一个查询任务的完整代码
Nov 19 #Python
Django 自动生成api接口文档教程
Nov 19 #Python
You might like
PHP网上调查系统
2006/10/09 PHP
模仿OSO的论坛(一)
2006/10/09 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
用Python进行简单图像识别(验证码)
2018/01/19 Python
Python模块搜索路径代码详解
2018/01/29 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
看上去很美观后感
2015/06/10 职场文书
初一数学教学反思
2016/02/17 职场文书
python的变量和简单数字类型详解
2021/09/15 Python
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL