Java中的代理模式(一)
大家好👋,我是极客涛😎,今天我们聊一聊java中的代理模式,话不多说,还是老思路,什么是代理模式,为什么要有代理模式,如何实现代理模式
代理模式
在说java中的代理模式之前,我们可以先想一想生活的例子,这里也是一个加深自己对程序设计理解的一种学习方式,程序本质上就是对生活的抽象和实现。
生活中的代理模式太多了:
- 我想租房,不需要自己去网上搜,找个中介,把需求讲清楚,房子就找好了
- 我想吃饭,点个外卖外卖员就送上门了,我就可以直接吃了,不用自己去拿
这里如果我们进行抽象的话,对于租房来说,我本身只有判断房子适不适合我的能力,但是我没有(不想)对房源进行检索的能力,这时候中介其实就是代理了我对房源进行检索,但最终房子适不适合还是我自己决定;对点外卖来说,我不想自己去店里拿,所以外卖小哥代理了我帮把饭送到我手上,我自己用吃的能力。
也就是说,代理模式的核心就是对被代理对象的能力拓展。
代理方式
静态代理
我们拿我吃饭的场景举例说明
- 定义一个Person接口,有吃的能力
- 定义实现类GeekTao,代表我自己,实现了吃的能力
- 定义实现类Taker,代表外卖员,外卖员除了有吃的能力,自己还有送外卖的专属能力
/*** 人*/
public interface Person {/*** 吃*/void eat();
}/*** 我*/
public class GeekTao implements Person {@Overridepublic void eat() {System.out.println("我自己吃饭");}
}/*** 外卖员*/
public class Taker implements Person {private final Person me;public Taker() {me = new GeekTao();}@Overridepublic void eat() {// 送外卖this.send();// 吃饭me.eat();}private void send() {System.out.println("外卖员把外卖送到家");}
}
测试方法
public class ProxyTest {public static void main(String[] args) {Person taker = new Taker();taker.eat();}
}
运行结果
外卖员把外卖送到家
我自己吃饭
真好,现在可以不用自己去拿外卖,外卖小哥就把外卖送到了;还有个问题,吃完我又口渴了,如果我还想喝,抽象一个drink方法,外卖小哥是不是还得实现一个drink方法?下边做个简单示例。
/*** 外卖员*/
public class Taker implements Person {private final Person me;public Taker() {me = new GeekTao();}@Overridepublic void eat() {// 送外卖this.send();// 吃饭me.eat();}private void send() {System.out.println("外卖员把外卖送到家");}@Overridepublic void drink() {// 送外卖this.send();// 喝水me.drink();}
}
以上实现其实就是静态代理,核心在于“静态”,对于我来说外卖小哥要实现一次,除了我还有很多人也需要点外卖,那外卖小哥每个都要适配一次;每次我自己有了新的需求(方法),外卖小哥也要跟着实现,但其实对于他来说实现方法都一样(都是送外卖),所以这也是静态代理的缺点,非常不灵活。
动态代理
还是拿我吃饭的场景举例子,上边说到外卖小哥不只是给我送外卖,那如何实现一个小哥可以给不同的人送外卖呢?
- 定义一个Person接口,有吃的能力
- 定义实现类GeekTao,代表我自己,实现了吃的能力
- 定义实现类XiaoMing,也实现了吃的能力,也需要点外卖
- 定义实现类TakerCommon,代表外卖员,外卖员除了有吃的能力,自己还有送外卖的专属能力,并且不只是可以给我送外卖,还可以给其他人送
其它类和上边例子一样,只贴了TakerCommon。
/*** 通用外卖员*/
public class TakerCommon implements InvocationHandler {private Object proxyTarget;public Object sendWho(Object target) {this.proxyTarget = target;return Proxy.newProxyInstance(proxyTarget.getClass().getClassLoader(), proxyTarget.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("外卖员送外卖给 " + proxyTarget.getClass().getSimpleName());return method.invoke(proxyTarget, args);}
}
测试方法
public class ProxyTest {public static void main(String[] args) {TakerCommon takerCommon = new TakerCommon();Person me = (Person) takerCommon.sendWho(new GeekTao());me.eat();System.out.println("========================");Person xiaoming = (Person) takerCommon.sendWho(new XiaoMing());xiaoming.eat();}
}
测试结果
外卖员送外卖给 GeekTao
我自己吃饭
========================
外卖员送外卖给 XiaoMing
小明吃饭
这时候我又想喝,那直接调用drink方法就行了,因为对于外卖小哥来说都是一样的。
测试方法
public class ProxyTest {public static void main(String[] args) {TakerCommon takerCommon = new TakerCommon();Person me = (Person) takerCommon.sendWho(new GeekTao());me.eat();me.drink();System.out.println("========================");Person xiaoming = (Person) takerCommon.sendWho(new XiaoMing());xiaoming.eat();xiaoming.drink();}
}
测试结果
外卖员送外卖给 GeekTao
我自己吃饭
外卖员送外卖给 GeekTao
我自己喝
========================
外卖员送外卖给 XiaoMing
小明吃饭
外卖员送外卖给 XiaoMing
小明在喝
总结
代理模式的核心就是对被代理对象的能力拓展
静态代理适合简单业务,不经常变动,因为实现逻辑简单,开发成本低
动态代理适合变动可能性较大的业务。
相关文章:
Java中的代理模式(一)
大家好👋,我是极客涛😎,今天我们聊一聊java中的代理模式,话不多说,还是老思路,什么是代理模式,为什么要有代理模式,如何实现代理模式 代理模式 在说java中的代理模式之前…...
跳跃游戏-算法
题目 给定一个数组nums {1,2,3,4,5},每个元素nums[i]表示从i这个位置最多可以向前跳跃nums[i]个台阶,求最小需要跳几次就可以调到末尾 思路 反向查找 从末尾开始逐个向前判断最远的起跳位置,接着再以该位置递归的判断 public int jumpT…...
ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评
ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评 ERP领域SAP、ORACLE相对于国内厂商如用友、金蝶优势在哪? SAP,ORACLE操作习惯一般国人用不惯;相对于国产软件,界面也很难看&#x…...
外汇天眼:美国证券交易委员会(SEC)采纳了一系列规定,以加强与特殊目的收购公司(SPACs)相关的投资者保护
美国证券交易委员会(SEC)今天通过了一系列新规和修订,以增强特殊目的收购公司(SPACs)的首次公开募股(IPOs)中的披露,并在SPACs与目标公司之间的后续业务合并交易(de-SPAC…...
kotlin map 与 flatmap
kotlin map 与 flatmap 是2个不同的概念的 map 是一种数据结构,flatmap 是一个高阶函数,处理集合用的 Map Map 是一种数据结构,它由一系列的键值对组成,每个键都是唯一的,并且与一个特定的值相关联。你可以通过键来…...
nginx-rtmp-module 支持 Enhancing RTMP HEVC(H.265)
Enhancing RTMP, FLV 2023年7月31号正式发布,主要支持了HEVC(H.265)、VP9、AV1视频编码,发布差不多半年了,很多开源项目已支持,最近打算播放和推送端也支持下,想找个支持的rtmp server方便测试用,但没找到合…...
2024最新JDK1.8+JDK17+JDK21安装包下载+文档
2024年更新,JDK8的64位和32位安装包都有,Java8最新文档也有,JDK17和JDK21的最新安装包也有 因为网上的安装包都不是最新的,所以自己去Oracle官网登录下载保存了一份,需要的朋友下面网盘链接下载 JDK8—64位安装程序&…...
如何利用chatgpt提升工作效率
chatgpt全领域小助手 项目管理:制定项目计划、跟踪进度、分配任务和记录里程碑。客户服务:回答常见问题、提供产品支持和处理客户投诉,提升客户满意度。销售支持:提供销售培训、销售脚本和客户资料,辅助销售团队进行销…...
WinSCP下载安装并实现远程SSH本地服务器上传文件
文章目录 1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件,它的主要功能是在本地与远程计…...
QEMU搭建arm虚拟机开发环境
获取QEMU代码 git clone https://gitlab.com/qemu-project/qemu.git 切换对应的工程分支 使用git指令切换到对应的分支上,我这里使用的是stable-4.0的分支 git checkout -b stable-4.0 remotes/origin/stable-4.0 配置&编译 在工程的根目录下执行 ./conf…...
web 应用常见的安全问题
一xss攻击 人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。 跨站脚本攻击ÿ…...
502. IPO
502. IPO 题目链接:502. IPO 代码如下: //堆的使用 class Solution { public:int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {vector<pair<int,int>> mp;//优先队列默认的是大…...
如何安装MeterSphere并实现无公网ip远程访问服务管理界面
文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通…...
做FP独立站怎么引流?这个引流法宝收好了!
近年来,由于卖家数量飙升导致平台竞争持续升级,卖家之间的恶性循环竞争以及平台政策的不断调整等,造成了众多亚马逊等跨境卖家纷纷从平台转向独立站。可是,转型做独立站前要先考虑清楚独立站与平台二者之间的区别。 如果在第三方平…...
幻兽帕鲁PalWorld服务器搭建教程,1分钟开服,纯小白教程,无需基础
雨云面板服快速开幻兽帕鲁PalWorld服务器的教程,配置文件修改方法和配置项中文注释。 最近这游戏挺火,很多人想跟朋友联机,如果有专用服务器,就不需要房主一直开着电脑,稳定性也好得多。 幻兽帕鲁简介 《幻兽帕鲁》…...
算法小抄01
1. 计数排序是一种基于 统计 的排序算法 2. 基于比较的排序算法有:(1)直接插入排序;(2)冒泡排序;(3)简单选择排序;(4)希尔排序&#…...
Spring Boot 集成 API 文档 - Swagger、Knife4J、Smart-Doc
文章目录 1.OpenAPI 规范2.Swagger: 接口管理的利器3.Swagger 与 SpringFox:理念与实现4.Swagger 与 Knife4J:增强与创新5.案例:Spring Boot 整合 Swagger35.1 引入 Swagger3 依赖包5.2 优化路径匹配策略兼容 SpringFox5.3 配置 Swagger5.4 S…...
2024年软考报名时间及条件,小白必看
不少考生开始准备报名2024年软件水平考试,那么报名软考有没有学历、专业以及工作经验等方面的限制呢?今天就给大家梳理下2024年软考考试,若有变更,也会及时更新内容。 免费送备考资料。联系我 2024年软考考试时间 2024年软考有两次考试&a…...
vue 跨域XMLHttpRequest
vue 跨域 使用XMLHttpRequest 亲测好使 let url=http://127.0.0.1:9000/pssnotifyyb?b=1//url=https://api.j4u.ink/v1/store/other/proxy/remote/moyu.jsonvar xhr=new XMLHttpRequest()xhr.open(GET,url,true)//第三个参数是是否异步请求,默认true xhr.onreadyst…...
【正点原子STM32】STM32基础知识(F1F4F7H7 STM32系统框架、寻址范围、存储器映射的存储器功能划分、寄存器映射)
一、STM32系统框架 1.1、Cortex M内核 & 芯片1.2、F1系统架构1.3、F4系统架构1.4、F7系统架构1.5、H7系统架构 二、STM32的寻址范围? 三、存储器映射 存储器功能划分(F1为例)STM32F1存储器映射图 四、寄存器映射 寄存器基础知识STM3…...
3个技巧快速掌握arp-scan局域网设备发现
3个技巧快速掌握arp-scan局域网设备发现 【免费下载链接】arp-scan The ARP Scanner 项目地址: https://gitcode.com/gh_mirrors/ar/arp-scan 在网络管理工作中,您是否经常遇到这样的困扰:明明设备连接了网络,却无法通过常规ping命令发…...
从夏普IGZO技术授权看显示面板产业的技术转移与战略博弈
1. 从一则旧闻看显示产业的全球棋局:技术、资本与生存的博弈2013年夏天,一则来自日本的消息在科技产业圈,特别是显示面板和半导体供应链领域,激起了不小的涟漪。全球知名的消费电子品牌夏普公司,宣布了一项与中国国有企…...
Midjourney Minwa风格终极调试手册:7类常见失效场景(水墨晕染失真、线条断裂、文化符号错位)及对应--stylize动态补偿值
更多请点击: https://intelliparadigm.com 第一章:Midjourney Minwa风格的本质解构与美学基因图谱 Minwa(民画)风格源自朝鲜半岛传统民间绘画,其核心并非写实再现,而是以象征性构图、平涂色块、非透视空间…...
基于 4SAPI 的企业文档智能处理系统:效率提升 20 倍,信息提取准确率 95%
前言 在数字化转型的今天,企业积累了海量的非结构化文档数据,包括合同、财务报表、技术手册、产品说明书、会议纪要、法律文件等。这些文档中蕴含着企业最核心的知识和资产,但传统的人工文档处理模式已经成为企业数字化的最大瓶颈࿱…...
Python 3.14.5 发布:多项改进,垃圾回收器回滚,还有这些新特性!
Python 3.14.5 发布Python 3.14.5 现已发布,这是 3.14 的第五个维护版本。自 3.14.4 以来,包含约 154 项错误修复、构建改进和文档更改。垃圾回收器回滚值得注意的是,Python 3.14.5 中的垃圾回收器 (GC) 发生了变化。由于一些原因,…...
幸福依赖于抽象的 能力的庖丁解牛
它的本质是:**将幸福的源头从 具体实现类 (Concrete Implementations)(如特定的伴侣、具体的工作、固定的房产)转移到 抽象接口 (Abstract Interfaces)(如爱的能力、创造价值的技能、感知美好的心智)。具体实现是不可控…...
adloop:可编程规则引擎驱动的浏览器网络请求深度拦截与定制
1. 项目概述:一个被低估的广告拦截与隐私增强工具如果你和我一样,是个对网页上无处不在的弹窗广告、自动播放视频和恼人的跟踪脚本感到深恶痛绝的互联网用户,那你一定尝试过各种广告拦截器。从大名鼎鼎的AdBlock Plus、uBlock Origin…...
Illustrator脚本革命:7个必备工具彻底改变你的设计工作流
Illustrator脚本革命:7个必备工具彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否还在Adobe Illustrator中重复着枯燥的手工操作ÿ…...
音频算法调试利器:用Android App实时绘制EQ/DRC曲线,告别Matlab依赖
移动端音频算法调试革命:Android实时EQ/DRC可视化工具开发实战 在音频算法开发领域,调试环节长期被桌面级工具垄断,工程师们不得不忍受开发板与工作站之间的频繁切换。这种工作模式不仅效率低下,更无法满足现代音频产品快速迭代的…...
3分钟掌握9大网盘直链解析:告别限速烦恼的高效下载方案
3分钟掌握9大网盘直链解析:告别限速烦恼的高效下载方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...
