跳转至

代理模式

代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它提供了一个代理对象来控制对其他对象的访问。代理对象通常充当客户端和目标对象之间的中介,可以用于实现延迟加载、访问控制、缓存数据等功能。

代理模式的特点

  1. 控制对对象的访问:通过代理对象控制对目标对象的访问。
  2. 代理对象与目标对象接口一致:代理对象实现与目标对象相同的接口,客户端无需知道具体的目标对象。
  3. 增强目标对象的功能:代理对象可以在调用目标对象前后执行额外的操作,从而增强目标对象的功能。

代理模式的结构

  1. 抽象主题(Subject):定义了真实主题和代理主题的共同接口。
  2. 真实主题(Real Subject):定义了真实对象的具体实现。
  3. 代理(Proxy):保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来代替实体。

代理模式的Python实现

以下是代理模式在Python中的一个简单实现示例:

1. 定义抽象主题和真实主题类

from abc import ABC, abstractmethod

# 抽象主题接口
class Subject(ABC):
    @abstractmethod
    def request(self) -> None:
        pass

# 真实主题类
class RealSubject(Subject):
    def request(self) -> None:
        print("RealSubject: Handling request.")

2. 定义代理类

# 代理类
class Proxy(Subject):
    def __init__(self, real_subject: RealSubject) -> None:
        self._real_subject = real_subject

    def request(self) -> None:
        # 可以在调用真实主题之前或之后执行额外的操作
        print("Proxy: Logging the request before calling RealSubject.")
        self._real_subject.request()
        print("Proxy: Logging the request after calling RealSubject.")

3. 客户端代码

def client_code(subject: Subject) -> None:
    subject.request()

if __name__ == "__main__":
    real_subject = RealSubject()
    proxy = Proxy(real_subject)

    print("Client: Executing the client code with a real subject:")
    client_code(real_subject)

    print("\n")

    print("Client: Executing the same client code with a proxy:")
    client_code(proxy)

运行结果

Client: Executing the client code with a real subject:
RealSubject: Handling request.

Client: Executing the same client code with a proxy:
Proxy: Logging the request before calling RealSubject.
RealSubject: Handling request.
Proxy: Logging the request after calling RealSubject.

说明

  1. 抽象主题(Subject):定义了真实主题和代理主题的共同接口,即request方法。
  2. 真实主题(RealSubject):实现了抽象主题接口,定义了真实对象的具体行为。
  3. 代理(Proxy):保存了一个引用以便能够访问实体,并提供一个与抽象主题接口相同的接口,可以在调用真实主题前后执行额外的操作。

通过代理模式,可以在不改变客户端代码的情况下控制对对象的访问,实现了懒加载、权限控制、日志记录等功能。代理模式在需要控制对对象访问或者需要增强对象功能时非常有用,例如远程代理、虚拟代理、保护代理等场景。

评论