Proxy(代理)设计模式详解
代理模式是一种结构型设计模式,它提供了一个代理对象来控制对目标对象的访问。代理可以在目标对象之前进行一些操作,如控制访问权限、延迟实例化或添加额外的功能。
模式意图
- 目的:为其他对象提供一种代理以控制对该对象的访问。
- 核心思想:在客户端和目标对象之间引入一个中间对象(代理),用于处理客户端的请求。
UML类图(Markdown text
标签形式)
以下是代理模式的 UML 类图:
+--------------------+ +--------------------+
| Subject |<-------| RealSubject |
+--------------------+ +--------------------+
| + request(): void | | + request(): void |
+--------------------+ +--------------------+
▲
|
|
+--------------------+
| Proxy |
+--------------------+
| - _real_subject: |
| RealSubject |
| + request(): void |
| + _check_access(): |
| bool |
| + _log_access(): |
| void |
+--------------------+
输出解释
-
抽象接口(
Subject
):- 定义
request
方法,所有代理和真实对象都必须实现。
- 定义
-
真实对象(
RealSubject
):- 提供核心业务逻辑。
-
代理对象(
Proxy
):- 包含对真实对象的引用,并通过访问控制和日志记录功能扩展其行为。
模式结构
代理模式的结构主要包括以下角色:
- Subject(抽象主题接口):定义代理和实际对象的共有接口。
- RealSubject(真实对象):执行实际操作的对象。
- Proxy(代理对象):通过真实对象实现抽象接口,并对其访问进行控制。
Python实现
以下是代理模式的 Python 实现示例:
from abc import ABC, abstractmethod
class Subject(ABC):
"""抽象主题接口"""
@abstractmethod
def request(self):
pass
class RealSubject(Subject):
"""真实对象"""
def request(self):
print("RealSubject: Handling request.")
class Proxy(Subject):
"""代理对象"""
def __init__(self, real_subject: RealSubject):
self._real_subject = real_subject
def request(self):
if self._check_access():
self._real_subject.request()
self._log_access()
def _check_access(self):
print("Proxy: Checking access before forwarding request.")
return True
def _log_access(self):
print("Proxy: Logging the access to RealSubject.")
# 客户端代码
def client_code(subject: Subject):
subject.request()
print("Client: Executing with a real subject:")
real_subject = RealSubject()
client_code(real_subject)
print("\nClient: Executing with a proxy:")
proxy = Proxy(real_subject)
client_code(proxy)
使用场景
- 虚拟代理:延迟加载大对象,提升性能。
- 保护代理:控制对对象的访问权限。
- 智能引用:在访问对象时增加日志或跟踪功能。
代理模式通过代理对象添加额外的行为和控制,使其在许多场景下非常有用,如缓存、权限控制和远程代理等。