/**
* 静态代理:
* code阶段代理类就要知道代理谁,如本例中静态代理代理的是IDoGet
*/
public class Daili {
public static void main(String[] args) {
//静态代理
new DoGetProxy(new VolleyDoGet()).doGet("aaa");
}
}
interface IDoGet {
void doGet(String str);
}
class OkHttpDoGet implements IDoGet {
@Override
public void doGet(String str) {
System.out.println("使用OKHttp进行get请求" + str);
}
}
class VolleyDoGet implements IDoGet {
@Override
public void doGet(String str) {
System.out.println("使用Volley进行get请求" + str);
}
}
class DoGetProxy implements IDoGet {
private IDoGet proxy;
public DoGetProxy(IDoGet proxy) {
this.proxy = proxy;
}
@Override
public void doGet(String str) {
proxy.doGet(str);
}
}
/**
*动态代理
* 通过反射机制动态地生成代理者的对象,
* 也就是说我们在code阶段压根就不需要知道代理谁,代理谁我们将会在执行阶段决定。
* 而Java也给我们提供了一个便捷的动态代理接口InvocationHandler, 实现该接口需要重写其调用方法invoke。
*
*
* 动态代理通过一个代理类来代理N多个被代理类,
* 其实质是对代理者与被代理者进行解耦,使两者直接没有直接的耦合关系。相对而言静态代理则只
* 能为给定接口下的实现类做代理,如果接口不同那么就需要重新定义不同代理类,较为复杂,但是
* 静态代理更符合面向对象原则。
*/
public class DynamicDailiDemo {
public static void main(String[] args) {
// 动态代理
IDoGet volleyDoGet = new VolleyDoGet();
DynamicDaili dynamicDaili = new DynamicDaili(volleyDoGet);
ClassLoader loader = volleyDoGet.getClass().getClassLoader();
IDoGet doGet = (IDoGet) Proxy.newProxyInstance(loader, new Class[]{IDoGet.class}, dynamicDaili);
doGet.doGet("bbb");
}
}
class DynamicDaili implements InvocationHandler {
Object object;
public DynamicDaili(Object object) {
this.object = object;
}
/**
* 在这里,我们主要通过invoke方法来调用具体的被代理方法,也就是真实的方法。动态代理
* 可以使我们的代码逻辑更简洁
*/
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
return method.invoke(object, objects);
}
}
interface IDoGet {
void doGet(String str);
}
class OkHttpDoGet implements IDoGet {
@Override
public void doGet(String str) {
System.out.println("使用OKHttp进行get请求" + str);
}
}
class VolleyDoGet implements IDoGet {
@Override
public void doGet(String str) {
System.out.println("使用Volley进行get请求" + str);
}
}