package com.jason.staticProxy; /** * @author jason * @Description:定义一个汽车接口,里面包含汽车行驶的方法 * @date 2018/2/2 */ public interface Car { //定义一个汽车行驶的方法 public void run() throws Exception; }
package com.jason.staticProxy; 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 LogProxy extends TimeProxy{ //通过实现父类的run()方法来完成代理 @Override public void run() throws Exception { //模拟打印日志操作------在汽车行驶之前打印日志 System.out.println("汽车开始行驶..."); //父类对象来完成动作 super.run(); //模拟打印日志操作------在汽车结束之后打印日志 System.out.println("汽车结束行驶..."); } }
package com.jason.staticProxy; /** * @author jason * @Description: 通过继承来实现静态代理,和实现接口的实现方法是不同的 * @date 2018/2/2 */ public class TimeProxy extends Baoma { //重写父类的方法,完成对时间的代理 @Override public void run() throws Exception { //记录汽车行驶之前的时间 long start = System.currentTimeMillis(); //使用父类的方法完成行驶动作 super.run(); //记录汽车行驶之后的时间 long end = System.currentTimeMillis(); //完成功能,打印出汽车行驶的时间 System.out.println("汽车行驶的时间为"+(end - start)); } }
package com.jason.staticProxy; /** * @author jason * @Description:测试代理类的方法 * @date 2018/2/2 */ public class Test { public static void main(String[] args) throws Exception{ //-------------------------------------------------------------------------------------------- //仅仅测试一个代理类,代理时间的类的方法 TimeProxy timeProxy = new TimeProxy(); // timeProxy.run(); //--------------------------------------------------------------------------------------------- //测试时间和日志同时代理的类,并且因为我们继承的关系是日志类继承时间类,故执行顺序唯一 //如果要先代理时间,则需要时间代理类继承日志代理类 LogProxy logProxy = new LogProxy(); logProxy.run(); } }