静态代理之通过实现接口来实现代理
2018-02-02 13:42
661 查看
package com.jason.staticProxy; /** * @author jason * @Description: 定义一个汽车的接口,里面包含行驶的接口 * @date 2018/2/2 */ public interface Car { //里面定义一个行驶的方法 public void run() throws Exception; }
package com.jason.staticProxy; import com.jason.ex.thread.ThreadDemo; import java.util.Random; /** * @author jason * @Description: 一个实现了汽车的接口的类,并且里面实现了行驶的方法 * @date 2018/2/2 * * 这里有一个需求,想计算我们班汽车行驶的时间,因为JAVA程序我们遵循OCP(对扩展开放,对修改关闭)原则,所以为了不修改原来代码, * //我们来采用静态代理模式: * */ public class Baoma implements Car { //实现行驶的方法 @Override public void run() throws Exception{ //里面使用了使当前线程睡眠的方法,休眠若干秒 Thread.sleep(new Random().nextInt(1000)); System.out.println("奥迪汽车行驶结束..."); } }
package com.jason.staticProxy; /** * @author jason * @Description: 使用静态代理的方式来实现我们需求,得到汽车行驶的时间 * @date 2018/2/2 */ public class TimeProxy implements Car{ //将需要代理的对象注入到我们的代理类中,将其变为我们自己的一个属性 private Car car; //提供构造器,并且在初始化对象的时候,就将属性赋上 public TimeProxy(Car car){ this.car = car; } //实现我们汽车行驶的方法 @Override public void run() throws Exception { //记录汽车行驶之间的时间 long start = System.currentTimeMillis(); //执行汽车行驶的方法 car.run(); //记录汽车行驶结束的时间 long end = System.currentTimeMillis(); //得到汽车行驶的时间 System.out.println("汽车行驶的时间" + (end-start)); } }
package com.jason.staticProxy; /** * @author jason * @Description: 这里新增了一个需求,不仅仅想要计算汽车行驶的时间,还需要在汽车行驶前后分别打印一下日志 * 因为我们的代码设计是尽可能动源码,所以不能再原来的时间代理类中继续写代码 * 而是需要再定义一个类去代理日志 * @date 2018/2/2 */ public class LogProxy implements Car { //1:将需要代理的对象注入进来 private Car car; //2:提供构造器 public LogProxy(Car car){ this.car = car; } //实现我们的行驶方法 //里面完成代理 @Override public void run() throws Exception { //模拟打印日志操作------在汽车行驶之前打印日志 System.out.println("汽车开始行驶..."); //调用被代理目标的方法,开始执行 car.run(); //模拟打印日志操作------在汽车结束之后打印日志 System.out.println("汽车结束行驶..."); } }
package com.jason.staticProxy; import java.sql.Time; /** * @author jason * @Description: 测试静态代理类是否有用 * @date 2018/2/2 */ public class Test { public static void main(String[] args) throws Exception{ //----------------------------------------------------------------------------------------- //仅仅代理时间的测试方法 //初始化汽车对象 Baoma baoma = new Baoma(); //初始化代理类 TimeProxy timeProxy = new TimeProxy(baoma); //执行汽车行驶的方法 timeProxy.run(); //------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------ //测试同时代理时间和日志,这里先计算时间,再打印日志 //初始化汽车对象 Baoma baoma1 = new Baoma(); //初始化时间代理类 TimeProxy timeProxy1 = new TimeProxy(baoma1); //初始化日志代理类 LogProxy logProxy1 = new LogProxy(timeProxy1); //开始执行 logProxy1.run(); //------------------------------------------------------------------------------------------ //并且我们两个代理类的顺序可以随便指定,这里先打印日志,再计算时间 //测试同时代理时间和日志 //初始化汽车对象 Baoma baoma2 = new Baoma(); //初始化日志代理类 LogProxy logProx2 = new LogProxy(timeProxy1); //初始化时间代理类 TimeProxy timeProxy2 = new TimeProxy(baoma1); //开始执行 timeProxy2.run(); } }
相关文章推荐
- AOP:静态代理实现方式①通过继承②通过接口
- java多态(接口与实现)之静态代理
- 多线程-静态代理的方式 - 实现Runnable接口
- 通过代理接口在内存中动态生成代理类源代码并编译实现的真正动态代理
- 通过反射,将datatable转换为List集合(反射读取实体类的属性,并赋值),通过接口来实现MySql和MsSql数据的切换(二层反射),静态构造函数,抽象类和接口的区别
- java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。
- Java的代理模式(通过公共接口实现)
- 进程外COM组件实现IRpcChannelBuffer接口,客户端通过代理接口跨进程调用(有代码)
- Dubbo原理实现之代理接口的定义
- Spring2.5学习4.1_静态代理实现
- ubuntu 用nginx反向代理apache,实现静态文件用nginx,php文件用apache实现
- php使用curl通过代理获取数据的实现方法
- 通过Javascript调用微软认知服务情感检测接口的两种实现方式
- 如何整合Spring和Mybatis的思路分析(使用面向接口的mapper代理,不用再去写Dao的实现类)
- 通过泛型参数实现接口注入
- MyBatis Mapper 接口如何通过JDK动态代理来包装SqlSession 源码分析
- Android通过HttpURLConnection和HttpClient接口实现网络编程
- 简析静态xml布局如何通过动态代码实现
- ASP.NET无刷新客户端回调(通过实现ICallbackEventHandler接口)
- AM5728通过GPMC接口与FPGA高速数据通信实现