您的位置:首页 > 其它

静态代理之通过实现接口来实现代理

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐