应用场景:自己不想做,想让别人帮忙做自己的事情,甚至想让别人做的更好
静态代理
代理者和被代理者都需要实现接口,让代理者来做事情
public class MyProxyExt {
interface IBuild{
void create();
}
static class BuildImpl implements IBuild{
@Override
public void create() {
System.out.println("修建房子");
}
}
static class BuildProxy implements IBuild{
private BuildImpl build ;
public BuildProxy(BuildImpl build) {
this.build = build;
}
@Override
public void create() {
build.create();
System.out.println("修建泳池");
}
}
public static void main(String[] args) {
IBuild build = new BuildProxy(new BuildImpl()) ;
build.create();
}
}
动态代理
只有被代理对象实现接口
1.既然需要他人帮忙,那就要找到代理对象
2.其次就是要对方做事情,调用方法
解决这两个问题,分别需要Proxy和 InvocationHandler
public class MyProxy {
interface IBuild{
void create();
}
static class BuildImpl implements IBuild{
@Override
public void create() {
System.out.println("修建房子");
}
}
class BuildHandler implements InvocationHandler{
private Object object ;
public BuildHandler(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(object,args) ;
}
}
class BuildProxy {
public Object getInstance(Object object){
BuildHandler buildHandler = new BuildHandler(object) ;
return Proxy.newProxyInstance(object.getClass().getClassLoader() , object.getClass().getInterfaces(),buildHandler) ;
}
}
}
测试
public class Test {
public static void main(String[] args) {
MyProxy.IBuild build = new MyProxy.BuildImpl();
MyProxy.IBuild buildProxy = (MyProxy.IBuild) new MyProxy(). new BuildProxy().getInstance(build);
buildProxy.create();
}
}