1.代码结构
2.代码说明
Movie:一个电影类的接口。
public interface Movie {
void play();
}
RealMovie:真正被代理的对象,要实现Movie接口
public class RealMovie implements Movie {
@Override
public void play() {
System.out.println("电影《XXX》开始了");
}
}
ProxyMovie:静态代理实现模式,该代理也需要实现Movie接口。该静态代理新增了购票成功的方法。
public class ProxyMovie implements Movie {
RealMovie realMovie;
public ProxyMovie(RealMovie realMovie){
this.realMovie=realMovie;
}
@Override
public void play() {
start();
realMovie.play();
}
public void start(){
System.out.println("购票成功");
}
}
ProxyAll:动态代理实现模式,该代理不再实现Movie接口,而是实现动态代理提供的InvocationHandler接口。该动态代理新增了电影结束的方法。
public class ProxyAll implements InvocationHandler {
private Object obj;
public ProxyAll(Object obj){this.obj=obj;}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
method.invoke(obj,args);
end();
return null;
}
public void end(){
System.out.println("电影结束");
}
}
MyTest:测试
public class MyTest {
@Test
public void staticProxy(){
RealMovie realMovie=new RealMovie();
ProxyMovie proxyMovie=new ProxyMovie(realMovie);
proxyMovie.play();
}
@Test
public void proxy(){
RealMovie realMovie=new RealMovie();
ProxyAll proxyAll = new ProxyAll(realMovie);
Movie o = (Movie) Proxy.newProxyInstance(RealMovie.class.getClassLoader(), RealMovie.class.getInterfaces(), proxyAll);
o.play();
}
}
3.对比
静态代理和被代理的对象需要实现同一个接口,即本例中的Movie。
动态代理和被代理对象实现的是不同的接口。
动态代理通过Proxy.newProxyInstance(反射)获取指定的代理类。