漫画:什么是 “代理模式” ?
作者 | 小灰
来源 | 程序员小灰(ID:chengxuyuanxiaohui)
————— 第二天 —————
————————————
public interface IStudentService { void insertStudent(); void deleteStudent();}
public class StudentService implements IStudentService {public void insertStudent(){ //添加学生 }public void deleteStudent(){ //删除学生 }}
public class StudentService implements IStudentService {public void insertStudent(){ System.out.println("准备添加学生"); //添加学生 System.out.println("添加学生成功"); }public void deleteStudent(){ System.out.println("准备删除学生"); //删除学生 System.out.println("删除学生成功"); }
}
public class StudentServiceProxy implements IStudentService {IStudentService studentService;public StudentServiceProxy(IStudentService studentService){ this.studentService = studentService; }@Override public void insertStudent() { System.out.println("准备添加学生"); studentService.insertStudent(); System.out.println("添加学生成功"); }@Override public void deleteStudent() { System.out.println("准备删除学生"); studentService.deleteStudent(); System.out.println("删除学生成功"); }}
在上面的代码中,代理类和业务类继承了相同的接口,并且重写了添加/删除学生的方法。
在重写的方法中,我们不仅可以调用业务类的原有方法,并且在调用的前后可以进行额外的处理,比如加上日志、事务等等。
这样一来,在客户端当中,我们只要创建了代理类,就可以像使用业务类一样使用它,非常方便:
public class Client {public static void main(String[] args) { IStudentService studentServiceProxy = new StudentServiceProxy(new StudentService()); studentServiceProxy.insertStudent(); studentServiceProxy.deleteStudent(); }}
以Java语言为例,Java为我们提供了十分方便的创建动态代理的工具包。当我们生成动态代理的时候,我们需要使用到InvocationHandler接口和Proxy类。
具体的实现过程如下:
1.实现InvocationHandler接口,定义调用方法前后所做的事情:
public class StudentInvocationHandler implements InvocationHandler {private IStudentService studentService;public StudentInvocationHandler(IStudentService studentService){ this.studentService = studentService; }@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName() + "方法调用前"); method.invoke(studentService, args); System.out.println(method.getName() + "方法调用后"); return null; }}
2.通过Proxy类的newProxyInstance方法,动态生成代理对象:
public class Client {public static void main(String[] args) { IStudentService studentService = new StudentService(); InvocationHandler studentInvocationHandler = new StudentInvocationHandler(studentService); IStudentService studentServiceProxy = (IStudentService) Proxy.newProxyInstance(studentInvocationHandler.getClass().getClassLoader(), studentService.getClass().getInterfaces(), studentInvocationHandler); studentServiceProxy.insertStudent(); studentServiceProxy.deleteStudent(); }
}
更多精彩推荐
☞必看!程序员逃生指南
☞“硅谷之父”传奇:拯救斯坦福大学、培养大批高科技人才、指导创立惠普
☞腾讯、火绒回应“QQ 读取浏览器历史记录”;字节跳动起诉百度获赔 40 元;Redis 6.0.10 发布 | 极客头条☞云原生体系下的技海浮沉与理论探索
☞最新组合式模型量化方法,实现FPGA最高硬件利用率,准确率-推理速度达到SOTA
☞引介 | 用大白话解释 Taproot 对隐私性的影响
点分享
点收藏
点点赞
点在看
漫画:什么是 “代理模式” ?相关推荐
- GOF23设计模式(结构型模式)代理模式~
代理模式应用场景十分广泛,随便一个框架都会用到,因此学好代理模式对后续框架学习是最基本的要素!!今天我们就来讲讲代理模式! 目录 1.简介 1. 核心作用 2. 角色分析 2. 应用场景 4. 分类 ...
- Java 设计模式_代理模式(2016-08-19)
概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- ATS 5.3.0在反向代理模式下实现正向代理功能方法
以前,我在records.config中一般是配置成正向+反向的形式: 现在我打算改为反向代理模式,但是需要实现正向代理的功能: 同时在remap.config中配置 regex_map http:/ ...
- 设计模式 之美 -- 代理模式
文章目录 1. 解决问题 2. 应用场景 1. 业务系统的非功能性开发 2. 代理模式在RPC.缓存中的应用 3. 实现 C++实现 C语言实现 1. 解决问题 客户端和目标对象之间需要进行交互,此时 ...
- 设计模式之代理模式(Proxy Pattern)
定义:为其他对象提供一种代理以控制这个对象的访问,也叫做委托模式. 咱们比作游戏,通俗讲代理模式就是,一个主题虚基类派生出两个子类,一个玩家类,实现相关操作,一个是代练类,代替执行玩家相关操作,代练类 ...
- 设计模式之“代理模式”
代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用. 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理".所谓代理,就是一个人或者一 ...
- 设计模式之代理模式(Proxy)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- snmpd 子代理模式编译测试
1.参考链接 1)Net-snmp添加子代理示例 https://blog.csdn.net/eyf0917/article/details/39546651 2.操作步骤 1)网络拷贝下面的文件 h ...
- 大话设计模式读书笔记--4.代理模式
生活中的例子: 班主任让班长通知班委下午3点开会 班长就是班主任的代理 代理模式的目的是: 隐藏真实访问对象,同时可以处理别的事情 定义 代理模式:为其他对象提供一种代理以控制对这个对象的访问 也就是 ...
- Java设计模式之虚拟代理模式
描述: 虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成, ...
最新文章
- 新华三发布H3C Workspace数字工作空间:只需一张屏,程序员也能随时随地在云上写代码
- R语言使用dplyr将特定的数据列移动到最前面、使用dplyr将特定数据列移动到另一指定数据列的后面、使用dplyr将特定数据列移动到另一指定数据列的前面
- head在c语言中的作用,阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。【说明】 函数sort (NODE *head)的功能 - 赏学吧...
- _​_​i​n​t​6​4​ ​与​l​o​n​g​ ​l​o​n​g​ ​i​n​t
- 注意力机制~Attention Mechanism
- hdu-4811 Ball
- Document的理解
- Spring 基于注解(annotation)的配置之@Qualifier注解
- 公众号 -「前端攻略 开光篇」
- 条款28:避免返回handles指向对象内部的成分(Avoid returning handles to objects internals)...
- slub释放过程-do_slab_free
- 菜鸟安装Linux的问题记录
- 手撕包菜BT搜索引擎带爬虫自动抓取安装
- ai怎么做盒子效果图_仅需5步!手把手教你如何用AI绘制3D效果形象
- rrweb从数据库读取数据回放问题 (Error: Replayer need at least 2 events.)
- 【完整攻略】OPPO手机无密码解锁方法
- JavaScript 导出 table 为 Excel 表格
- JAVA的学习心路历程之JDK基础入门(上)
- 第六周作业(等值字串,KMP匹配,大整数相乘,最长公共子串,判断两个字符串是否匹配,最长回文子串,年号字串)
- day28 re(正则)模块
热门文章
- 马斯克的90后合伙人离职Neuralink!5岁学编程,曾创立2家公司
- 2021年人工智能全球最具影响力学者榜单AI 2000发布
- CVPR 2021 Oral|只用静态图像,就能实时渲染出丝滑3D效果
- linux如何关闭udp端口,如何阻止linux RHEL7中的udp端口范围(How to block udp ports range in linux RHEL7)...
- SAP QM初阶事务代码QA11对检验批做UD时出现很多UD Code的选择集?
- 2018年中国城市用电量30强
- 空洞卷积(Dilated Convolution):有之以为利,无之以为用
- 影响堪比登月!谷歌等设计DL新方式让神经网络无限深无限窄
- 深度学习神经网络都是从CNN和AlexNet开始的
- 免费教材丨第51期:数学基础课程----概率论教程、机器学习中的数学基础