从JDK中学习设计模式——代理模式

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

概述

代理模式(Proxy Pattern)通过代理对象来访问目标对象,它是一种对象结构型模式。

代理模式通过引入代理对象来连接客户端和目标对象,起到中介的作用,它的作用是隐藏客户不能看到的内容增添客户需要的额外服务。例如,张三开了一家水壶制造厂,客户只需要委托张三来获取需要的产品就可以了,然后由张三来正真下达生产的指令。客户告知的需求就是抽象主题,张三起到代理主题的角色,水壶是真实的主题。

结构

代理模式UML.png

  • Subject(抽象主题):一般是抽象类或接口,声明了真实主题和代理主题的共同接口,客户端通常针对抽象主题角色进行编程。
  • Proxy(代理主题):包含了对真实主题的引用,它可以在任何时候替代真实主题和控制对真实主题的使用。
  • RealSubject(真实主题):实现了真实的业务操作,客户端可以通过代理主题间接调用真实主题中定义的操作。

分类

根据代理对象不同分为静态代理和动态代理:

  1. 静态代理:代理类在程序编译运行前已经创建完毕,方法增强规则已被写好,同时规则也已经适配到具体的类的方法中了。
  2. 动态代理:也叫做 JDK 代理、接口代理。代理类不是提前创建好的,而是在程序运行过程中通过反射机制来创建的。方法规则已被写好,但要适配这些规则的类方法不确定。

代理模式根据其目的和实现方式不同可分为很多种类:

  1. 远程代理(Remote Proxy):为位于不同地址空间的对象提供代理,这个地址空间可以在同一台主机中,也可以在另一台主机中。
  2. 虚拟代理(Virtual Proxy):通过创建一个资源消耗较小的对象来表示资源消耗较大的对象,真实对象只在需要时才会被真正创建。
  3. 保护代理(Protect Proxy):又称防火墙代理,可以给不同的用户提供不同级别的使用权限。
  4. 缓存代理(Cache Proxy):提供某个对象的缓存,使多个客户端可以高效的共享这些对象
  5. 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作

优点

  1. 客户端可以针对抽象主题编程,增加和更换代理类无须修改源代码,符合开闭原则
  2. 通过代理对象来调用真实业务,降低了系统的耦合度

此外,不同类型的代理模式也具有独特的优点:

  1. 远程代理可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率
  2. 虚拟代理能够节省系统的开销
  3. 缓存代理通过缓存提升了系统性能
  4. 保护代理增强了系统的安全性

缺点

  1. 由于在客户端和真实主题之间增加了代理对象,因此可能会造成请求的速度变慢,并且增加了系统的复杂度
  2. 实现代理模式需要额外的工作,并且代理的实现过程可能十分复杂

应用场景

  1. 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
  2. 当需要用一个资源消耗较少的对象来代表一个资源消耗较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理。
  3. 当某个对象被频繁调用,并且每次调用无需重新计算时,可以使用缓存代理。
  4. 当需要为不同用户提供不同级别的访问权限时,可以使用保护代理。
  5. 当需要为一个对象的访问提供一些额外的操作时,可以使用智能引用代理。

JDK 中的应用

在 JDK 中 java.lang.reflect.Proxy 就使用了代理模式,它是其中的动态代理。

Guess you like

Origin juejin.im/post/7031929937888018469