代理模式

2025年8月18日 | 阅读 3 分钟

简单来说,代理是指代表另一个对象的对象。

根据 GoF,代理模式 “提供访问原始对象的控制”。

因此,我们可以执行许多操作,例如隐藏原始对象的信息,按需加载等。

代理模式也称为 替身或占位符。

RMI API 使用代理设计模式。 Stub 和 Skeleton 是 RMI 中使用的两个代理对象。

代理模式的优势

  • 它为原始对象提供了来自外部世界的保护。

代理模式的用法

它被用于

  • 它可用于虚拟代理场景 --- 考虑一个需要多次数据库调用来提取巨大图像的情况。由于这是一个昂贵的操作,因此在这里我们可以使用代理模式,这将创建多个代理并指向消耗大量内存的对象以进行进一步处理。 实际对象仅在客户端首次请求/访问该对象后才创建,之后我们可以直接引用代理来重用该对象。 这避免了对象的重复,从而节省了内存。
  • 它可用于保护代理场景 --- 它充当授权层,用于验证实际用户是否有权访问相应的内容。例如,在办公室中提供互联网访问限制的代理服务器。 仅允许有效的网站和内容,而其余的将被阻止。
  • 它可用于远程代理场景 --- 远程代理可以被认为是 RPC 调用中的存根。 远程代理提供存在于不同地址位置的对象的本地表示。 另一个例子是为远程资源(例如 Web 服务或 REST 资源)提供接口。
  • 它可用于智能代理场景 --- 智能代理通过在访问对象时插入特定操作来提供额外的安全层。例如,在访问真实对象之前检查它是否被锁定,这样其他对象就无法更改它。

代理模式的例子

让我们通过上面的 UML 图来理解代理设计模式的例子。

代理模式的 UML

Proxy Pattern UML

上述 UML 的实现

步骤 1

创建一个 OfficeInternetAccess 接口。

步骤 2

创建一个 RealInternetAccess 类,它将实现 OfficeInternetAccess 接口,以授予特定员工的权限。

文件:RealInternetAccess.java

步骤 3

创建一个 ProxyInternetAccess 类,它将实现 OfficeInternetAccess 接口,以提供 RealInternetAccess 类的对象。

文件:ProxyInternetAccess.java

步骤 4

现在,创建一个 ProxyPatternClient 类,它可以真正访问互联网。

文件:ProxyPatternClient.java

输出