4.12_proxy_结构型模式:代理模式

本文介绍了代理模式在结构型设计模式中的应用,包括远程代理、虚代理和保护代理。通过代理,可以控制对真实对象的访问,如在虚代理中延迟加载大对象,或在保护代理中实现权限控制。示例展示了如何使用Python实现这些代理类型。
摘要由CSDN通过智能技术生成
结构型模式
--- 代理模式 ---
内容:
    为其他对象提供一种代理,以控制对这个对象的访问

角色:
    1. 抽象实体 (Subject)
    2. 实体 (Real Subject)
    3. 代理 (Proxy)

适用场景:
    1. 远程代理:为远程的对象提供代理
    2. 虚代理:根据需要创建很大的对象
    3. 保护代理:控制对原始对象的访问,用于对象有不同访问权限时

优点:
    1. 远程代理:可以隐藏对象位于远程地址空间的事实
    2. 虚代理:可以进行优化,例如根据要求创建对象
    3. 保护代理:允许在访问一个对象时,有一些附加的内务处理
from abc import ABCMeta, abstractmethod


class Subject(metaclass=ABCMeta):
    """抽象实体 (Subject)"""

    @abstractmethod
    def get_content(self):
        pass

    @abstractmethod
    def set_content(self, content):
        pass


class RealSubject(Subject):
    """实体 (Real Subject)"""
    
    def __init__(self, filename):
        self.filename = filename
        f = open(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):
        self.filename = filename
        self.subject = None

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

    def set_content(self, content):
        if not self.subject:
            self.subject = RealSubject(self.filename)
        return self.subject.set_content(content)


class ProtectedProxy(Subject):
    """保护代理"""

    def __init__(self, filename):
        self.subject = RealSubject(filename)

    def get_content(self):
        return self.subject.get_content()

    def set_content(self, content):
        # 权限逻辑
        raise PermissionError('无写入权限!')


# subj = VirtualProxy('test.txt')
# print(subj.get_content())

subj = ProtectedProxy('test.txt')
print(subj.subject.get_content())
subj.set_content('abc')

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值