Java 代理模式
熟悉设计模式的人对于代理模式可能都不陌生。那什么事代理呢,例如我们要买一件国外的商品,但是自己买不到只能去找代购,这个代购就是我们的代理。我们来了解下java中的代理
静态代理
我们来举一个开车的例子,
首先定义一辆车

再新建一个具体实现类

这个时候启动汽车

输出
汽车发动
这个时候我们想在汽车发动前系上安全带,汽车发动后开始加速
我们可以这么写

这个时候我们再启动汽车

输出:
系安全带
汽车发动
加速前进
这里的CarProxy就是CarImpl的代理,CarImpl委托CarProxy实现启动前后的逻辑
动态代理
静态代理虽然好用,但是还是不够灵活。如果这个时候我在Car 再加一个刹车的方法,那么CarProxy也要实现相应的方法,这样的耦合性太强了。所以这个时候就需要介绍下另一种代理模式 动态代理
什么事动态代理呢?动态代理是在实现阶段不用关心代理谁,而在运行阶段才能确定代理那个对象?简单来说,动态代理不用自己写代理类
1.JDK代理
还是开车,我们再写一个代理类

刚开始看到可能会觉得很奇怪,这个类怎么开车呢,简而言之,这个类怎么才能代理Car的start方法呢。
这里主要用到了反射,JdkDynamicCarProxy调用方法时会调用invoke方法,通过反射代理原对象

同时,JdkDynamicCarProxy这个并不是代理类,他只是一个代理策略,我们不能只通过他实现代理
好,具体的我们开次车就知道了
我们首先要生成一个代理策略

再生成一个代理类,这里我们通过Proxy生成,这里有三个参数
参数1:ClassLoader
参数2:该实现类的所有接口
参数3:动态代理对象

合起来,现在的开车流程变成了

每次都要这一堆代码太浪费时间了,我们把它简化下,在JdkDynamicCarProxy中新加一个方法获取代理类

现在开次车的流程变成了

2.cglib代理
我们先新建一个代理策略类

这里需要实现 CGLib 给我们提供的 MethodInterceptor 实现类,并填充 intercept() 方法。方法中最后一个 MethodProxy 类型的参数 proxy,值得注意!CGLib 给我们提供的是方法级别的代理,也可以理解为对方法的拦截
跟jdk代理一样,我们需要新建一个代理类,这里我们通过Enhancer

Enhancer允许为非接口类型创建一个Java代理。Enhancer动态创建了给定类型的子类但是拦截了所有的方法。
现在开次车的流程变成了

感觉每次用都要new特别浪费
用单例模式改造下

现在开次车的流程变成了

好了,关于代理就介绍到这。
Java 代理模式的更多相关文章
- Java代理模式
java代理模式及动态代理类 1. 代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目 ...
- Java代理模式示例程序
Java代理模式示例程序 当然不是我想出来的,是我看的一个网上教程里的. 模拟的是一个对电脑公司的代理 真实类的接口: public interface SaleComputer { public S ...
- java 代理模式 总结
1.前言 最近舍友去面试遇到了关于java代理模式的问题. 我虽然知道怎么使用,但是没有做过正经的总结,因此有了这篇随笔,好好总结一下三大代理模式底层原理. 事实上,在开发项目的时候,基本用不上代理, ...
- 浅谈java代理模式
讲解java代理模式 目录 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 代理模式,即Proxy Pattern,23种java常用设计模式 ...
- Java代理模式/静态代理/动态代理
代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...
- JAVA代理模式与动态代理模式
1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某 ...
- java 代理模式一: 静态代理
代理模式: 代理模式的作用:为其他对象提供一种代理以控制对 特定对象 的访问. 某种情况下,一个客户不想或者直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用:通过代理对象引用. ...
- 18 java 代理模式 (转)
静态代理 1.新建一个接口,这个接口所提供的方法是关于数据库操作的 public interface EmployeeDao { public void updateSalary(); } 2.建一个 ...
- JAVA 代理模式(Proxy)
1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉 ...
- Java代理模式——静态代理模式
一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计 ...
随机推荐
- 201771010142 张燕& 杨蓉庆 实验十一 集合
实验十一 集合 实验时间 2018-11-8 一 理论知识 一般将数据结构分为两大类:线性数据结构和非线性数据结构.线性数据结构:线性表.栈.队列.串.数组和文件.非线性数据结构:树和图. 线性 ...
- Dev gridcontrol 添加多列按钮
gridcontrol中添加按钮的步骤: 1. 把列的ColumnEdit属性设置为RepositoryItemButtonEdit 2. 把TextEditStyle属性设置为HideTextEdi ...
- Linux 云计算运维之路
搭建中小型网站的架构图 s1-2 Linux 硬件基础 s3-4 linux 基础 文件系统 用户权限 s5-6 Linux 标准输出 系统优化 目录结构 w7 rsync-备份服务器 w8 NFS服 ...
- formdata的使用方法
function upload_single_file(value){ if(value==''){ layer.msg('请添加文件',{time:1500}) }else{ var formDat ...
- 为什么重写equals一定要重写hashCode?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白,以下是我的一些个人理解. ...
- 无知小子踏入python web大门
学习python flask的第一天,费劲我小白的脑子,总算完成了环境配置 详情如下,其他小白误走弯路,希望和我一样爱好python的人坚信:python或许是最好的语言! 那么,开始喽,有不对的地方 ...
- 用jquery制作简易日历
html代码如下: div align="center" id="divAll"> <table id="tab" border ...
- jquery向Django后台发送数组
在$.ajax中加入 traditional:true, //加上此项可以传数组 后端用 array = request.POST.getlist('ids') #django接收数组 来接收数组
- InetAddress and InetSocketAddress
1.InetAddress(包含IP地址及主机名) InetAddress is = InetAddress.getLocalHost(); /* 通过静态方法获得本机的对象 */ System.ou ...
- eclipse 工作区空格和回车键显示为乱码
eclipse 工作区空格和回车键显示为乱码 解决方法:Windows => Preferences => General =>Editors =>Text Editor =& ...