作者 | 小灰

来源 | 程序员小灰(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 对隐私性的影响

点分享

点收藏

点点赞

点在看

漫画:什么是 “代理模式” ?相关推荐

  1. GOF23设计模式(结构型模式)代理模式~

    代理模式应用场景十分广泛,随便一个框架都会用到,因此学好代理模式对后续框架学习是最基本的要素!!今天我们就来讲讲代理模式! 目录 1.简介 1. 核心作用 2. 角色分析 2. 应用场景 4. 分类 ...

  2. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  3. ATS 5.3.0在反向代理模式下实现正向代理功能方法

    以前,我在records.config中一般是配置成正向+反向的形式: 现在我打算改为反向代理模式,但是需要实现正向代理的功能: 同时在remap.config中配置 regex_map http:/ ...

  4. 设计模式 之美 -- 代理模式

    文章目录 1. 解决问题 2. 应用场景 1. 业务系统的非功能性开发 2. 代理模式在RPC.缓存中的应用 3. 实现 C++实现 C语言实现 1. 解决问题 客户端和目标对象之间需要进行交互,此时 ...

  5. 设计模式之代理模式(Proxy Pattern)

    定义:为其他对象提供一种代理以控制这个对象的访问,也叫做委托模式. 咱们比作游戏,通俗讲代理模式就是,一个主题虚基类派生出两个子类,一个玩家类,实现相关操作,一个是代练类,代替执行玩家相关操作,代练类 ...

  6. 设计模式之“代理模式”

    代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用. 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理".所谓代理,就是一个人或者一 ...

  7. 设计模式之代理模式(Proxy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. snmpd 子代理模式编译测试

    1.参考链接 1)Net-snmp添加子代理示例 https://blog.csdn.net/eyf0917/article/details/39546651 2.操作步骤 1)网络拷贝下面的文件 h ...

  9. 大话设计模式读书笔记--4.代理模式

    生活中的例子: 班主任让班长通知班委下午3点开会 班长就是班主任的代理 代理模式的目的是: 隐藏真实访问对象,同时可以处理别的事情 定义 代理模式:为其他对象提供一种代理以控制对这个对象的访问 也就是 ...

  10. Java设计模式之虚拟代理模式

    描述: 虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成, ...

最新文章

  1. 新华三发布H3C Workspace数字工作空间:只需一张屏,程序员也能随时随地在云上写代码
  2. R语言使用dplyr将特定的数据列移动到最前面、使用dplyr将特定数据列移动到另一指定数据列的后面、使用dplyr将特定数据列移动到另一指定数据列的前面
  3. head在c语言中的作用,阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。【说明】 函数sort (NODE *head)的功能 - 赏学吧...
  4. _​_​i​n​t​6​4​ ​与​l​o​n​g​ ​l​o​n​g​ ​i​n​t
  5. 注意力机制~Attention Mechanism
  6. hdu-4811 Ball
  7. Document的理解
  8. Spring 基于注解(annotation)的配置之@Qualifier注解
  9. 公众号 -「前端攻略 开光篇」
  10. 条款28:避免返回handles指向对象内部的成分(Avoid returning handles to objects internals)...
  11. slub释放过程-do_slab_free
  12. 菜鸟安装Linux的问题记录
  13. 手撕包菜BT搜索引擎带爬虫自动抓取安装
  14. ai怎么做盒子效果图_仅需5步!手把手教你如何用AI绘制3D效果形象
  15. rrweb从数据库读取数据回放问题 (Error: Replayer need at least 2 events.)
  16. 【完整攻略】OPPO手机无密码解锁方法
  17. JavaScript 导出 table 为 Excel 表格
  18. JAVA的学习心路历程之JDK基础入门(上)
  19. 第六周作业(等值字串,KMP匹配,大整数相乘,最长公共子串,判断两个字符串是否匹配,最长回文子串,年号字串)
  20. day28 re(正则)模块

热门文章

  1. 马斯克的90后合伙人离职Neuralink!5岁学编程,曾创立2家公司
  2. 2021年人工智能全球最具影响力学者榜单AI 2000发布
  3. CVPR 2021 Oral|只用静态图像,就能实时渲染出丝滑3D效果
  4. linux如何关闭udp端口,如何阻止linux RHEL7中的udp端口范围(How to block udp ports range in linux RHEL7)...
  5. SAP QM初阶事务代码QA11对检验批做UD时出现很多UD Code的选择集?
  6. 2018年中国城市用电量30强
  7. 空洞卷积(Dilated Convolution):有之以为利,无之以为用
  8. 影响堪比登月!谷歌等设计DL新方式让神经网络无限深无限窄
  9. 深度学习神经网络都是从CNN和AlexNet开始的
  10. 免费教材丨第51期:数学基础课程----概率论教程、机器学习中的数学基础