代理模式
静态代理
继承方式实现
public interface Moveable {
void move();
}
public class Car implements Moveable {
@Override
public void move () {
try {
System.out.println("汽车行驶中..." );
Thread.sleep(new Random().nextInt(1000 ));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Car2 extends Car {
@Override
public void move () {
long startTime = System.currentTimeMillis();
System.out.println("汽车开始行驶" );
super .move();
long endTime = System.currentTimeMillis();
System.out.println("结束行驶,行驶了" +(endTime-startTime)+"ms" );
}
}
public static void main (String[] args) {
Car2 car2 = new Car2();
car2.move();
}
聚合方式实现
public class Car3 implements Moveable {
private Car car;
public Car3 (Car car) {
super ();
this .car = car;
}
@Override
public void move () {
long startTime = System.currentTimeMillis();
System.out.println("汽车开始行驶" );
car.move();
long endTime = System.currentTimeMillis();
System.out.println("结束行驶,行驶了" + (endTime - startTime) + "ms" );
}
}
public static void main (String[] args) {
Car car = new Car();
Moveable m = new Car3(car);
m.move();
}
jdk动态代理
public class TimeHandler implements InvocationHandler {
private Object target;
public TimeHandler (Object target) {
super ();
this .target = target;
}
/**
* @param proxy 被代理的对象
* @param method 被代理对象的方法
* @param args 方法的参数
* @return Object 方法的返回值
*/
@Override
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
long startTime = System.currentTimeMillis();
System.out.println("汽车开始行驶" );
method.invoke(target);
long endTime = System.currentTimeMillis();
System.out.println("结束行驶,行驶了" +(endTime-startTime)+"ms" );
return null ;
}
}
public static void main (String[] args) {
Car car = new Car();
InvocationHandler h = new TimeHandler(car);
Class<?> c = car.getClass();
Moveable m = (Moveable) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), h);
m.move();
}