当前位置: 首页 > news >正文

代理模式(Proxy模式)

所谓的代理,就是一个人或者一个机构代替另一个人或者另一个机构去做一些事情(类似于中介或者代理商)。

代理的种类

远程代理:为一个位于不同的地址空间的对象提供一个局域代表对象。
虚拟代理:根据需要创建一个资源消耗大的对象,使得此对象只有在需要的时候才被真正创建。
Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有客户端需要时,才真正采取行动。
保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的客户提供不同级别的使用权限。
防火墙(Firewall)代理:保护目标,不让恶意用户接近。
同步化 (Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
智能 (Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将此对象调用的记录的次数记录下来等。

代理模式的结构

代理模式所涉及的角色有:

  • 抽象主题角色:声明了真实主题与代理主题的共同接口(共有的特性)。
  • 代理主题角色:含有对真实主题角色的引用(操作真实主体对象),代理角色通常在将客户端调用传递给真实主题对象的之前或者之后都会执行某些操作(方法),而不是只单纯的返回真实的对象。
  • 真实主题角色:定义了代理角色所代表的真实对象。

一个例子:电脑代理商
抽象主题角色:SaleComputer
代理主题角色:ComputerProxy
真是主体角色:ComputerMaker

在生活当中还有很多的代理模式例子,比如说考四级时,很多人选择去找枪手。这也是一个代理模式的例子。

在代理模式里,有一个很重要的东西:动态代理

自从JDK的版本到1.3以后,java语言通过java.lang.reflect库中,提供了三个类来直接支持代理模式。分别是:Proxy,InvocoationHandler,Method。

代理类的实现

public class DBQueryHandler implements InvocationHandler {//定义主题接口private IDBQuery realQuery = null;@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//如果第一次调用,生成真实主题if (realQuery == null) {realQuery = new DBQuery();}if ("request".equalsIgnoreCase(method.getName())) {System.out.println("调用前做点啥,助助兴.....");Object result = method.invoke(realQuery, args);System.out.println("调用后做点啥,助助兴.....");return result;} else {// 如果不是调用request方法,返回真实主题完成实际的操作return method.invoke(realQuery, args);}}static IDBQuery createProxy() {IDBQuery proxy = (IDBQuery) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), //当前类的类加载器new Class[]{IDBQuery.class}, //被代理的主题接口new DBQueryHandler() // 代理对象,这里是当前的对象);return proxy;}
}public class Test {// 客户端测试方法public static void main(String[] args) {IDBQuery idbQuery = DBQueryHandler.createProxy();idbQuery.request();}
}
http://www.lryc.cn/news/302522.html

相关文章:

  • Android使用shape定义带渐变色的背景
  • 轻松搞定Makefile
  • 【C++之类和对象篇002】
  • k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(三)
  • 基于SSM的疫情期间学生信息管理平台的设计与实现(有报告)。Javaee项目。ssm项目。
  • LeetCode_20_简单_有效的括号
  • gRPC 备查
  • MySQL 基础知识(十)之 MySQL 架构
  • [晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型
  • Delphi v11 安卓权限申请
  • 频谱仿真平台HTZ Communications为私有5G建设铺平道路
  • 【高效开发工具系列】PyCharm使用
  • 进程终止与进程等待
  • MySQL 基础知识(六)之数据查询(二)
  • 蓝桥杯嵌入式STM32G431RBT6知识点(主观题部分)
  • ELAdmin 部署
  • 计算机功能简介:EC, NVMe, SCSI/ISCSI与块存储接口 RBD,NUMA
  • linux上安装bluesky的步骤
  • 视频监控需求八问:视频智能分析/视频汇聚平台EasyCVR有何特性?
  • django rest framework 学习笔记2
  • 第四篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:pyttsx3自动化脚本经典案例
  • model.train()和model.eval()两种模式的原理
  • docker的底层原理六: 联合文件系统(UnionFS)
  • 【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
  • 自养号测评低成本高效率推广,安全可控
  • ubuntu22.04@laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module
  • 【elk查日志 elastic(kibana)】
  • RapidMiner数据挖掘2 —— 初识RapidMiner
  • 基于STM32的光照检测系统设计
  • 车辆管理系统设计与实践