<Python设计模式>-代理模式

1 概述

为其他对象提供一种代理以控制对这个对象的访问

租客通过找中介租房子,中介就是房东的一个代理,中介有权利带客户看房子,但是中介不允许做房东给他赋予权限之后的事情,否则就是违法的。

代理模型常用模式有:
远程代理,为远程对象提供代理
保护代理,保护原始对象,用于对象有不同的访问形式
虚代理,对于一个很大的对象提供一个虚代理,比如浏览器的无图模式,开启后看不到图片,当点击后发起网络请求拿到图片

角色

抽象实体
实体
代理

2 代码实现

虚代理 根据需要创建对象

from abc import ABCMeta,abstractmethod

class Subject(metaclass=ABCMeta):
    """
    接口类,约束真实类和代理类,让高层代码感觉调用真实类和代理类是一样的
    """
    @abstractmethod
    def get_content(self):
        pass

    @abstractmethod
    def set_content(self,content):
        pass



class RealSubject(Subject):
	"""
		
	"""
    def __init__(self, filename=None):
        self.filename = filename
        f = open(self.filename,'r')
        print("读取文件内容")
        self.content = f.read()
        f.close()

    def get_content(self):
        return self.content

    def set_content(self,content):
        f = open(self.filename,'w')
        f.write(content)
        f.close()


class VirtualProxy(Subject):
    def __init__(self,filename=None):
        self.filename = filename
        self.subj = None

    def get_content(self):
        if not self.subj:
            self.subj = RealSubject(self.filename)
        return self.subj.content

    def set_content(self,content):
        if not self.subj:
            self.subj = RealSubject(self.filename)
        self.subj.set_content(content)
"""
OUT:
    rs = RealSubject(filename='test.txt') # 读取文件内容

    virtual = VirtualProxy(filename='test.txt')  # 不会输出“读取文件内容”
 
    print(virtual.get_content()) 
	读取文件内容
	hello woshinibaba
"""

保护代理

class ProtectProxy(Subject):
    def __init__(self,filname):
        self.filename = filname
        self.subj = RealSubject(self.filename)
    def get_content(self):
        return self.subj.get_content()

    def set_content(self,content):
        raise PermissionError


if __name__ == '__main__':
    pro = ProtectProxy(filname='test.txt')
    print(pro.get_content())
    """读取文件内容 hello woshinibaba"""
    pro.set_content('fdsa') # PermissionError



3 优势&劣势

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kobe_OKOK_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值