当前位置: 首页 > 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.dtcms.com/a/333965.html

相关文章:

  • 基于Python3.10.6与jieba库的中文分词模型接口在Windows Server 2022上的实现与部署教程
  • 跑实验记录
  • HTTP 通信中的认证方式
  • macOS 中查看当前生效 shell 及配置文件的方法
  • Boost搜索引擎项目(详细思路版)
  • 数字化与人工智能的崛起及其社会影响研究报告
  • Navicat 为 SQLite 数据库设置密码指南
  • 学习游戏制作记录(制作系统与物品掉落系统)8.16
  • AT89C52单片机介绍
  • 《设计模式》代理模式
  • Day56 Java面向对象10 方法重写
  • 《Python学习之字典(一):基础操作与核心用法》
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • 拒绝造轮子(C#篇)使用SqlSugar实现数据库的访问
  • Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
  • 玩转tokenizer
  • huggingface TRL中的对齐算法: KTO
  • PMP-项目管理-十大知识领域:成本管理-估算预算、控制成本、避免超支
  • 免费下载 Landsat 系列遥感影像——地理空间数据云
  • 《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
  • ALBEF/BLIP/BLIP2/Instruct BLIP/X Instruct BLIP
  • 从废弃到珍宝——旧物二手回收小程序系统的价值发现之旅
  • 曲面/线 拟合gnuplot
  • 新手向:Python列表、元组、集合和字典的用法对比
  • 谷歌手机刷机和面具ROOT保姆级别教程
  • 基于 LoRA的广义知识蒸馏(GKD)训练
  • 软考 系统架构设计师系列知识点之杂项集萃(125)
  • 给纯小白的 Python 操作 Excel 笔记
  • STM32 延时函数详解
  • HackMyVM-Uvalde