12-代理模式

代理模式

分析

  • **代购商品:**顾客 → 代购网站 → 商品

  • **软件开发:**客户端 → 代理对象 → 真实对象

image-20221212194832801

类型
  • 远程代理
  • 保护代理
  • 虚拟代理
  • 缓冲代理
  • 智能引用代理
  • ……

实例:代理服务器

image-20221212194939412

代理模式的定义

image-20221212195025595

对象结构型模式

  • 引入一个新的代理对象
  • 代理对象在客户端对象目标对象之间起到中介的作用
  • 去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务
    • 在代理类中增加新服务

代理模式结构

image-20221212195740022

符合开闭原则

  • 增加服务只需要增加新的代理类即可,不修改源代码
  • image-20221212201721885
代理模式包含以下3个角色:
  • Subject(抽象主题角色)

    • 接口和抽象类均可
  • Proxy(代理主题角色)

  • RealSubject(真实主题角色)

抽象主题类典型代码
1
2
3
public abstract class Subject {
public abstract void request();
}
真实主题类典型代码
1
2
3
4
5
public class RealSubject extends Subject{
public void request() {
//业务方法具体实现代码
}
}
代理类典型代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Proxy extends Subject {
private RealSubject realSubject = new RealSubject(); //维持一个对真实主题对象的引用 
public void preRequest() {
…...
}
 
public void request() {
preRequest();
realSubject.request(); //调用真实主题对象的方法
postRequest();
}
 
public void postRequest() {
……
}
}

几种常见的代理模式

  • 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以在同一台主机中,也可以在另一台主机中,远程代理又称为大使(Ambassador)

    • 工作在本地,代理的是远程的对象
    • 最难实现的代理方式
    • image-20221212202138593
      • Java中通过RMI来实现
  • 虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建

    • 桌面快捷方式,通过小文件代理大的exe文件
    • QQ空间、朋友圈中使用小图片代理大图片
  • 保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限

  • 缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果

    • 内存中的数据代理硬盘中的数据(需要有保证内存和硬盘数据一致的机制)
  • 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等

实例类图
image-20221212200831919 image-20221212200848807

image-20221212200859017

以上类图用到了以下代理:

  1. 保护代理

  2. 智能引用代理

(1) AccessValidator:身份验证类,业务类

(2) Logger:日志记录类,业务类

(3) Searcher:抽象查询类,充当抽象主题角色

(4) RealSearcher:具体查询类,充当真实主题角色

(5) ProxySearcher:代理查询类,充当代理主题角色

(6) Client:客户端测试类

结果及分析

  • 保护代理和智能引用代理

  • 在代理类ProxySearcher中实现对真实主题类的权限控制和引用计数

远程代理

动机
  • 客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速地响应并处理客户端的请求

  • 可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在

  • 客户端完全可以认为被代理的远程业务对象是在本地而不是在远程,而远程代理对象承担了大部分的网络通信工作,并负责对远程业务方法的调用

结构

image-20221212204422569

Java通过RMI实现远程代理

虚拟代理

动机
  • 对于一些占用系统资源较多或者加载时间较长的对象,可以给这些对象提供一个虚拟代理

  • 在真实对象创建成功之前虚拟代理扮演真实对象的替身,而当真实对象创建之后,虚拟代理将用户的请求转发给真实对象

  • 使用一个“虚假”的代理对象来代表真实对象,通过代理对象来间接引用真实对象,可以在一定程度上提高系统的性能

应用
  • 由于对象本身的复杂性或者网络等原因导致一个对象需要较长的加载时间,此时可以用一个加载时间相对较短的代理对象来代表真实对象(结合多线程技术)

  • 一个对象的加载十分耗费系统资源,让那些占用大量内存或处理起来非常复杂的对象推迟到使用它们的时候才创建,而在此之前用一个相对来说占用资源较少的代理对象来代表真实对象,再通过代理对象来引用真实对象

Java动态代理

概述
  • 动态代理(Dynamic Proxy)可以让系统在运行时根据实际需要来动态创建代理类,让同一个代理类能够代理多个不同的真实主题类而且可以代理不同的方法

  • Java语言提供了对动态代理的支持,Java语言实现动态代理时需要用到位于java.lang.reflect包中的一些类

模式优点:共有优点

  • 能够协调调用者和被调用者,在一定程度上==降低了系统的耦合度==

  • 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则系统具有较好的灵活性和可扩展性

模式优点:不同类型

  • 远程代理:可以将一些消耗资源较多的对象和操作移至性能更好的计算机上提高了系统的整体运行效率

  • 虚拟代理:通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销

  • 缓冲代理:为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果优化系统性能,缩短执行时间

  • 保护代理:可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限

模式缺点

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢(例如保护代理)

  • 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂(例如远程代理)

模式适用环境

  • 当客户端对象需要访问远程主机中的对象时可以使用远程代理

  • 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理

  • 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理

  • 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理

  • 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2024 Guijie Wang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信