原文: https://howtodoinjava.com/design-patterns/structural/proxy-design-pattern/

根据代理设计模式的 GoF 定义,代理对象为另一对象提供代理或占位符来控制对其的访问。 代理基本上可以替代我们由于许多原因而创建的预期对象,例如,与创建完全初始化的原始对象相关的安全性原因或成本。

1.何时使用代理设计模式

代理对象隐藏原始对象并控制对其的访问。 当我们可能想要使用可以充当其他接口的类时,可以使用代理。

代理大量用于实现与延迟加载相关的用例,在这种情况下,我们直到真正需要时才创建完整的对象。

代理也可以用于在原始对象周围添加额外的安全层。

2.代理模式的真实示例

  • hibernate 中,我们编写了从数据库中获取实体的代码。 Hibernate 返回一个对象,该对象由代理(通过扩展域类由 Hibernate 动态构造)到基础实体类。 客户端代码能够读取数据,而无论需要使用代理读取什么内容。
    这些代理实体类有助于实现延迟加载方案,在这种方案中,只有在明确请求关联实体时,才提取它们。 它有助于提高 DAO 操作的性能。

  • 在公司网络中,互联网访问位于网络代理后面。 所有网络请求都通过代理,该代理首先检查对允许的网站和发布到网络的数据的请求。 如果请求看起来可疑,则代理将阻止该请求,否则请求将通过。

  • 在面向切面的编程(AOP)中,由 AOP 框架创建的一个对象,用于实现切面协定(建议方法执行等)。 例如,在 Spring AOP 中,AOP 代理将是 JDK 动态代理或 CGLIB 代理。

3.代理设计模式

3.1 架构

代理设计模式 - 图1

代理设计模式

3.2 设计参与者

  • Subject – 是一个接口,它公开了可供客户端使用的功能。
  • RealSubject – 是实现Subject的类,并且是具体的实现,需要隐藏在代理后面。
  • Proxy – 通过扩展它来隐藏真实对象,并且客户端通过此代理对象与真实对象进行通信。 通常,当客户端请求真实对象时,框架会创建此代理对象。

4.代理设计模式示例

在给定的示例中,我们有一个RealObject,客户端需要访问它才能执行某项操作。 它将要求框架提供RealObject的实例。 但是由于需要保护对该对象的访问,因此框架将对RealObjectProxy的引用返回。

对代理对象的任何调用都用于其他要求,并且该调用将传递给实际对象。

  1. public interface RealObject
  2. {
  3. public void doSomething();
  4. }
  1. public class RealObjectImpl implements RealObject {
  2. @Override
  3. public void doSomething() {
  4. System.out.println("Performing work in real object");
  5. }
  6. }
  1. public class RealObjectProxy extends RealObjectImpl
  2. {
  3. @Override
  4. public void doSomething()
  5. {
  6. //Perform additional logic and security
  7. //Even we can block the operation execution
  8. System.out.println("Delegating work on real object");
  9. super.doSomething();
  10. }
  11. }
  1. public class Client
  2. {
  3. public static void main(String[] args)
  4. {
  5. RealObject proxy = new RealObjectProxy();
  6. proxy.doSomething();
  7. }
  8. }

程序输出。

  1. Delegating work on real object
  2. Performing work in real object

5.常见问题

5.1 有哪些不同类型的代理

代理通常分为四种类型:

  1. 远程代理 – 表示远程授乳的对象。 要与远程对象对话,客户端需要在网络通信方面做其他工作。 代理对象代表原始对象进行此通信,而客户端则专注于实际交谈。
  2. 虚拟代理 – 延迟昂贵对象的创建和初始化,直到需要时才按需创建对象。 Hibernate 创建的代理实体是虚拟代理的示例。
  3. 保护代理 – 帮助实现对原始对象的安全性。 他们可以在方法调用之前检查访问权限,然后根据结论允许或拒绝访问。
  4. 智能代理 – 当客户端访问对象时,执行其他内部管理工作。 一个示例可以是在访问真实对象之前检查它是否已锁定,以确保没有其他对象可以更改它。

5.2 代理模式与装饰器模式

两种模式之间的主要区别是它们承担的责任。 装饰器专注于添加职责,但是代理专注于控制对对象的访问。

在评论中向我发送有关代理模式的问题。

学习愉快!

参考文献:

图片来源 – 维基百科