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

【设计模式系列】代理模式(八)

一、什么是代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对象,可以在不改变实际对象代码的前提下,增加额外的功能操作,如访问控制、延迟初始化、日志记录等。

二、代理模式的角色

  1. 主题(Subject)

    • 提供了一个接口,使得代理对象和真实对象可以被同等对待。客户端通过这个接口与代理对象或真实对象交互,从而解耦了客户端和真实对象。
  2. 真实主题(Real Subject)

    • 包含了业务逻辑的具体实现。它是最终执行操作的对象,但客户端不直接与它交互。

  3. 代理(Proxy)

    • 在客户端和真实主题之间起到中介的作用。代理可以控制对真实主题的访问,可以在访问前后添加额外的处理,如访问控制、延迟初始化、日志记录等。

三、代理模式的典型应用

  1. 远程代理(Remote Proxy):在分布式系统中,远程代理用于隐藏对象位于不同地址空间的事实。客户端通过远程代理与远程对象进行交互,就好像它们在本地一样。典型案例是RPC框架

  2. 智能引用代理(Smart Reference Proxy):在访问对象时执行额外的操作,例如引用计数、加载持久对象到内存等。在资源管理中,智能引用代理可以用来跟踪对象的使用情况,并在适当的时候进行清理。

  3. 装饰代理(Decorator Proxy):在不修改对象的基础上,动态地添加额外的功能。这与装饰器模式相似,但通过代理模式实现,可以在运行时动态地添加或更换装饰。

四、代理模式在Proxy中的应用

在 Java 中,java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口是代理模式的典型应用。以下是它们在代理模式中的应用细节:

  1. InvocationHandler 接口:这是 Java 提供的用于创建动态代理的核心接口。它定义了 invoke(Object proxy, Method method, Object[] args) 方法,该方法在代理实例上的方法被调用时将被调用。

  2. Proxy 类:这个类提供了 newProxyInstance 方法,用于在运行时创建动态代理类实例。

  3. 真实主题(Real Subject):这是你想要代理的真实对象,它实现了特定的业务接口。

  4. 代理(Proxy):这是实现了与真实主题相同的接口的代理类,它的作用是在访问真实主题之前或之后进行额外的操作。

以下是一个简单的 Java 动态代理示例:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 真实主题接口
interface Subject {void request();
}// 真实主题实现
class RealSubject implements Subject {public void request() {System.out.println("RealSubject: Handling request");}
}// 代理类
class ProxyHandler implements InvocationHandler {private Object target;public ProxyHandler(Object target) {this.target = target;}public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before the actual method call");Object result = method.invoke(target, args);System.out.println("After the actual method call");return result;}
}// 客户端代码
public class ProxyPatternDemo {public static void main(String[] args) {RealSubject realSubject = new RealSubject();ProxyHandler proxyHandler = new ProxyHandler(realSubject);Subject proxySubject = (Subject) proxyHandler.getProxyInstance();proxySubject.request();}
}

在这个示例中,RealSubject 是真实主题,实现了 Subject 接口。ProxyHandler 是代理类,实现了 InvocationHandler 接口,并在 invoke 方法中添加了额外的逻辑。客户端代码通过 ProxyHandler 创建了 RealSubject 的代理实例 proxySubject,并通过代理实例调用了 request 方法。这样,ProxyHandler 就可以在调用真实主题的方法前后添加额外的操作,如日志记录。

http://www.lryc.cn/news/473717.html

相关文章:

  • 微服务架构设计的初次尝试——基于以太坊智能合约 + NestJS 微服务的游戏社区与任务市场系统:架构设计
  • “北斗+实景三维”,助力全域社会治理
  • #渗透测试#SRC漏洞挖掘# 信息收集-常见端口及谷歌语法
  • 如何使用java雪花算法在分布式环境中生成唯一ID?
  • 【php常用公共函数】php获取指定时间段相差几小时,几分钟,几秒
  • 图文深入介绍Oracle DB link(一)
  • Uniswap/v2-core使用及其交易流程
  • clickhouse运维篇(二):多机器手动部署ck集群
  • OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用
  • Java 实现 RESTful 风格的 Web 服务详解
  • 18.网工入门篇--------今天介绍下广域网技术
  • 鸿蒙原生应用开发及部署:首选华为云,开启HarmonyOS NEXT App新纪元
  • Spring JdbcTemplate详解
  • Docker篇(Docker安装)
  • Pytorch 实现图片分类
  • 得物App获评新奖项,正品保障夯实供应链创新水平
  • 【数据结构-邻项消除】力扣735. 小行星碰撞
  • 002-Kotlin界面开发之Kotlin旋风之旅
  • VMware Workstation Pro for Personal Use (For Windows)
  • 论文 | PROMPTAGATOR : FEW-SHOT DENSE RETRIEVAL FROM 8 EXAMPLES
  • 使用 Github 进行项目管理
  • 企业SRC挖掘选择与信息收集指南
  • Golang | Leetcode Golang题解之第524题通过删除字母匹配到字典里最长单词
  • 【DBeaver】连接带kerberos的hive[Apache|HDP]
  • Unity3D 开发教程:从入门到精通
  • 文件操作和 IO(一):文件基础知识 文件系统操作 => File类
  • 用Pyhon写一款简单的益智类小游戏——2048
  • akshare股票涨跌幅自定义范围查询:A股、港股、美股
  • 通过js控制修改css变量
  • <HarmonyOS第一课>HarmonyOS SDK开放能力简介的课后习题