代理模式:原来是这样子

代理模式是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理模式通常在不直接访问对象或者访问对象存在某些限制时使用,它可以在客户端和目标对象之间引入一个代理对象,通过代理对象来间接访问目标对象,从而控制对目标对象的访问。

代理模式的结构包括以下几个角色:

  • 抽象主题(Subject):定义了目标对象和代理对象的共同接口,客户端通过这个接口访问目标对象。
  • 具体主题(Real Subject):实现了抽象主题接口,是真正的目标对象。
  • 代理(Proxy):实现了抽象主题接口,并保存了对具体主题对象的引用,它可以控制对具体主题对象的访问,通常在访问具体主题对象之前或之后执行一些额外的操作。

代理模式的常见应用场景包括:

  • 远程代理:在客户端和服务器端之间创建代理对象,用于处理远程方法调用和网络通信。
  • 虚拟代理:延迟加载目标对象,直到真正需要使用时才创建目标对象,以节省资源。
  • 保护代理:控制对目标对象的访问权限,限制客户端对目标对象的操作。
  • 缓存代理:在访问目标对象之前检查缓存,如果缓存中存在相应的结果,则直接返回,否则访问目标对象并将结果缓存起来。

下面是一个简单的 Python 实际案例,演示了保护代理的使用场景:

from abc import ABC, abstractmethod

# 抽象主题接口
class Door(ABC):
    @abstractmethod
    def open(self):
        pass

    @abstractmethod
    def close(self):
        pass

# 具体主题类
class LabDoor(Door):
    def open(self):
        print("实验室的门已打开")

    def close(self):
        print("实验室的门已关闭")

# 代理类
class SecurityDoor(Door):
    def __init__(self, door):
        self._door = door

    def open(self):
        if self.authenticate():
            self._door.open()
        else:
            print("无权限打开门")

    def close(self):
        self._door.close()

    def authenticate(self):
        # 模拟身份验证逻辑
        password = input("请输入密码以验证身份:")
        return password == "password123"

# 客户端代码
if __name__ == "__main__":
    lab_door = LabDoor()
    security_door = SecurityDoor(lab_door)

    # 通过安全门代理对象打开门,需要身份验证
    security_door.open()

    # 正常关闭门
    security_door.close()

在这个案例中,LabDoor 是具体主题类,表示实验室的门;SecurityDoor 是代理类,用于保护实验室门,控制对其打开操作的访问。通过代理类 SecurityDoor,可以在打开门之前执行身份验证操作。

查看原文:代理模式:原来是这样子

关注公众号 "字节航海家" 及时获取最新内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值