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(); } }