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

设计模式之静态代理

一些个人理解

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

那么,既然要代理一个东西,就要传入它吧?
【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.lryc.cn/news/622866.html

相关文章:

  • Java 10 新特性及具体应用
  • ABB焊接机器人弧焊省气
  • 多机编队——(6)解决机器人跟踪过程中mpc控制转圈问题
  • 【轨物方案】预防性运维:轨物科技用AI+机器人重塑光伏电站价值链
  • MyBatis极速通关中篇:核心配置精讲与复杂查询实战
  • 大模型教机器人叠衣服:2025年”语言理解+多模态融合“的智能新篇
  • Tomcat架构深度解析:从Server到Servlet的全流程揭秘
  • blender制作动画导入unity两种方式
  • ENSP的简单动态路由rip协议配置
  • 广东省省考备考(第七十八天8.16)——资料分析、判断推理(强化训练)
  • Docker目录的迁移
  • GaussDB 数据库架构师修炼(十三)安全管理(3)-行级访问控制
  • 6JSON格式转python并实现数据可视化
  • 在ubuntu系统上离线安装jenkins的做法
  • 零基础学习人工智能的完整路线规划
  • Flink Stream API 源码走读 - window 和 sum
  • (第十七期)HTML图像标签详解:从入门到精通
  • 【完整源码+数据集+部署教程】高尔夫球追踪与识别系统源码和数据集:改进yolo11-LAWDS
  • 【基础-判断】可以通过ohpm uninstall 指令下载指定的三方库
  • 力扣(接雨水)——基于最高柱分割的双指针
  • 【开发技巧】VS2022+QT5+OpenCV4.10开发环境搭建QT Creator
  • 肖臻《区块链技术与应用》第23-26讲 - The DAO事件、BEC事件、反思和总结
  • Qt 关于QString和std::string数据截断的问题- 遇到\0或者0x00如何处理?
  • ★CentOS:MySQL数据备份
  • 三天速通 Vue+Flask+SQLite 项目+阿里云轻量应用级服务器【宝塔面板】②
  • 数学建模Topsis法笔记
  • TOGAF八步一法笔记2
  • 【DL学习笔记】常用数据集总结
  • OpenShift 4.19安装中的变化
  • 民法学学习笔记(个人向) Part.5