proxy pattern

master
terry 3 years ago
parent 159854552f
commit febdcd66fe

@ -19,5 +19,11 @@
<artifactId>spring-context</artifactId> <artifactId>spring-context</artifactId>
<version>5.3.21</version> <version>5.3.21</version>
</dependency> </dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -0,0 +1,5 @@
package proxy;
public interface Movable {
void move();
}

@ -0,0 +1,16 @@
package proxy;
import java.util.Random;
public class Tank implements Movable{
@Override
public void move(){
System.out.println("tank is moving...");
try {
Thread.sleep(new Random().nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,26 @@
package proxy.cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import proxy.Tank;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Tank.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before...");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("end...");
return result;
}
});
Tank tank = (Tank) enhancer.create();
tank.move();
}
}

@ -0,0 +1,43 @@
package proxy.dynamic;
import proxy.Movable;
import proxy.Tank;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MainV1 {
public static void main(String[] args) {
Tank tank = new Tank();
Movable m = (Movable) Proxy.newProxyInstance(tank.getClass().getClassLoader(), new Class[]{Movable.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("method " + method.getName() + " start...");
Object o = method.invoke(tank, args);
System.out.println("method " + method.getName() + " end...");
return o;
}
});
m.move();
System.out.println("-------------------------------------------------------------------------------------------------------");
Movable m2 = (Movable) Proxy.newProxyInstance(tank.getClass().getClassLoader(), new Class[]{Movable.class}, new TankLogHandler(tank));
m2.move();
}
}
class TankLogHandler implements InvocationHandler{
private Tank tank;
public TankLogHandler(Tank tank) {
this.tank = tank;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("tank start...");
Object o = method.invoke(tank, args);
System.out.println("tank stop...");
return o;
}
}

@ -0,0 +1,11 @@
package proxy.st;
import proxy.Tank;
public class Main {
public static void main(String[] args) {
new TankTimeProxy(new TankLogProxy(new Tank())).move();
// log start -> tank moving -> log end -> tank move time
new TankLogProxy(new TankTimeProxy(new Tank())).move();
}
}

@ -0,0 +1,18 @@
package proxy.st;
import proxy.Movable;
public class TankLogProxy implements Movable {
private Movable m;
public TankLogProxy(Movable m) {
this.m = m;
}
@Override
public void move() {
System.out.println("tank start moving...");
m.move();
System.out.println("tank end moving...");
}
}

@ -0,0 +1,22 @@
package proxy.st;
import proxy.Movable;
/*
* move move
* */
public class TankTimeProxy implements Movable {
private Movable m;
public TankTimeProxy(Movable m) {
this.m = m;
}
@Override
public void move() {
long start = System.currentTimeMillis();
m.move();
long end = System.currentTimeMillis();
System.out.println("move time: " + (end-start));
}
}
Loading…
Cancel
Save