设计模式-结构型-代理模式

代理模式

概述

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

对象

  • 抽象实体(Subject)
  • 实体(RealSubject)
  • 代理(Proxy)

适用场景

  • 远程代理:为远程对象提供代理
  • 虚代理:根据需要创建很大的对象
  • 保护代理:控制对原始对象的访问,用于对象有不同访问对象时

例子

# 假设对文件操作类进行代理

from abc import ABCMeta, abstractmethod

# 实体接口
class FileInterface(metaclass=ABCMeta):
    @abstractmethod
    def write(self, content):
        pass
    @abstractmethod
    def read(self):
        pass

# 实体
class File(FileInterface):

    def __init__(self, name):
        self.name = name
        # 假设创建对象时需要获取文件的内容
        with open(self.name, mode='a+', encoding='utf-8') as fi:
            self.content = fi.read()
        
    def write(self, content):
        with open(self.name, 'w', encoding='utf-8') as fi:
            fi.write(content)
    
    def read(self):
        with open(self.name, 'r', encoding='utf-8') as fi:
            return fi.read()

# 虚代理
class VirtualProxy(FileInterface):

    def __init__(self, name):
        self.name = name
        # 创建时不会创建文件对象,
        # 可以优化资源,在使用时
        # 进行创建
        self.file_proxy = None
    
    def write(self, conrent):
        if not self.file_proxy:
            self.file_proxy = File(self.name)
        return self.file_proxy.write(conrent)

    def read(self):
        if not self.file_proxy:
            self.file_proxy = File(self.name)
        return self.file_proxy.read()

# 保护代理
class ProtectProxy(FileInterface):
    def __init__(self, name):
        self.name = name
        self.file_proxy = File(self.name)
    
    # 写保护
    def write(self, conrent):
        # 验证权限
        raise Exception("没有写权限")

    def read(self):
        return self.file_proxy.read() 

print("虚代理")
virtual_proxy = VirtualProxy('test.txt')
print('创建时不会创建file obj')
print('写入')
virtual_proxy.write('testing ...')
print('读取')
print(virtual_proxy.read())

print("保护代理")
protect_proxy = ProtectProxy('test.txt')
print('读取')
print(protect_proxy.read())
print('写入')
protect_proxy.write('testing ...')

优点

  • 远程代理:可以隐藏对象位于远程地址的事实
  • 虚代理:可以进行优化,例如根据需求创建对象
  • 保护代理:允许在访问一个对象是存在一些附加的业务处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值