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

设计模式之静态代理

一些个人理解

顾名思义,就是代理一个对象。

那么,既然要代理一个东西,就要传入它吧?
【1】所以将代理对象当作属性【【2】往往通过构造方法传入被代理的目标对象】。

既然要代理,那必然要和代理对象拥有相同的功能吧?
所以实现了和代理对象相同的方法。【3】

那么我们怎么能实现同样的功能呢?
我们让他们实现同一个接口就行。【4】

但是如果我实现了功能,还要自己执行的话,岂不是这个代理反而和被代理的目标对象混为一谈,变成一个东西了吗?,
考虑到我们传入的被代理的目标对象,显然是通过这个传入的目标对象来执行功能【5】

一个例子

假如有个计算器接口,功能是简单的加减乘除。

【4,创建一个接口】
public interface MathCalculator {int div(int i, int j);int mul(int i, int j);int sub(int i, int j);int add(int i, int j);}
【接口的实现类,被代理的对象】
public class MathCalculatorImpl implements MathCalculator {@Overridepublic int div(int i, int j) {return 0;}@Overridepublic int mul(int i, int j) {return 0;}@Overridepublic int sub(int i, int j) {return 0;}@Overridepublic int add(int i, int j) {return i+j;}
}
【代理对象,和被代理对象一样,实现同一个接口】
public class CalculatorStaticProxy implements MathCalculator {private MathCalculator mathCalculator;//【1,将目标对象当作属性】// 【2】通过构造方法传入被代理的目标对象public CalculatorStaticProxy(MathCalculator mathCalculator) {this.mathCalculator = mathCalculator;}// 【3】要和代理对象拥有相同的功能@Overridepublic int div(int i, int j) {// 【5】,使用传入的目标对象来执行功能return this.mathCalculator.div(i,j);}@Overridepublic int mul(int i, int j) {// 【5】,使用传入的目标对象来执行功能return this.mathCalculator.mul(i,j);}@Overridepublic int sub(int i, int j) {// 【5】,使用传入的目标对象来执行功能return this.mathCalculator.sub(i,j);}@Overridepublic int add(int i, int j) {// 【5】,使用传入的目标对象来执行功能return this.mathCalculator.add(i,j);}
}
【测试静态代理】
public class MathCalTest {@Testpublic void test01() {MathCalculator mathCalculator = new MathCalculatorImpl();CalculatorStaticProxy calculatorStaticProxy = new CalculatorStaticProxy(mathCalculator);int add = calculatorStaticProxy.add(1, 1);System.out.println(add);}
}

附加说明

代理模式(Proxy)​,为其他对象提供一种代理以控制对这个对象的访问。
在这里插入图片描述
ISubject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy

RealSubject类,定义Proxy所代表的真实实体

Proxy类,保存一个引用使得代理可以访问实体,并提供与Subject的接口相同的方法,这样代理就可以用来替代实体

http://www.xdnf.cn/news/17893.html

相关文章:

  • 拒绝造轮子(C#篇)使用SqlSugar实现数据库的访问
  • KingbaseES高可用架构深度解析——从读写分离到异地灾备的全方位守护
  • Vue2.x核心技术与实战(一)
  • Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
  • 《探索IndexedDB实现浏览器端UTXO模型的前沿技术》
  • Blackwell 和 Hopper 架构的 GPGPU 新功能全面综述
  • debian 13 显示中文字体 不再显示菱形块 终端显示中文
  • 【121页PPT】锂膜产业MESERP方案规划建议(附下载方式)
  • week1-[循环嵌套]画正方形
  • hex文件结构速查
  • Java研学-SpringCloud(三)
  • LCR 076. 数组中的第 K 个最大元素
  • 集成电路学习:什么是Image Segmentation图像分割
  • QT|windwos桌面端应用程序开发,当连接多个显示器的时候,如何获取屏幕编号?
  • 嵌入式第二十九课!!!回收子进程资源空间函数与exec函数
  • Deepoc具身智能模型如何重塑康复辅助设备
  • 如何理解AP中SM中宿主进程?
  • 另类的pdb恢复方式
  • 第十四节:物理引擎集成:Cannon.js入门
  • python自学笔记9 Seaborn可视化
  • 【100页PPT】数字化转型集团信息化总体解决方案(附下载方式)
  • 【机器人-基础知识】ROS1和ROS2对比
  • shell脚本实现sha256sum校验并拷贝校验通过的文件
  • OpenCV Python——图像查找(特征匹配 + 单应性矩阵)
  • Kotlin作用域函数全解:run/with/apply/let/also与this/it的魔法对决
  • fs模块_写入文件
  • Layers(图层)
  • OpenSCA开源社区每日安全漏洞及投毒情报资讯|14th Aug. , 2025
  • 【车联网kafka】常用参数及其命令总结(第八篇)
  • Backblaze 2025 Q2硬盘故障率报告解读