代理模式)
首先什么是代理模式?
代理模式就是通过引入代理对象去帮助真实对象完成一些事情,防止直接访问目标对象给系统带来不必要的复杂性。
代理模式一般分为三个角色:
- 抽象角色: 指代理对象和真实对象对外提供的公共方法,一般为一个接口
- 真实角色: 需要实现抽象角色接口,定义了真实角色所实现的业务逻辑,供代理对象调用,也就是真实业务提供者。
- 代理角色: 是真实角色的代理,内部就是引入真实角色来完成特定的方法,但我们可以在这个类里封装自己想要的逻辑。
静态代理: 把代理模式写死,真实对象和被代理对象都要实现固定的接口才能实现代理模式。
缺点:每个代理只能为一个代理来服务,
动态代理: 通过一个代理类实现全部的代理功能
公共接口:
public interface Massage {
public void massage();
}
public interface Wash {
public void wash();
}
真实对象:
public class Alvin implements Massage ,Wash {
public void massage(){
System.out.println("精通各种按摩手法");
}
@Override
public void wash() {
System.out.println("洗脚服务");
}
}
代理对象:
public class Main {
public static void main(String[] args) {
Alvin alvin = new Alvin();
Object o = Proxy.newProxyInstance(Main.class.getClassLoader(), new Class[]{Massage.class, Wash.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/**
* 在哪个对象上调用什么方法,然后是方法的参数
*/
System.out.println("在按摩之前---");
method.invoke(alvin, args);
System.out.println("在按摩之后---");
return null;
}
});
Massage massage = (Massage) o;
massage.massage();
}
}
原理:jdk实现的动态代理只能代理接口,对接口进行了一下拷贝,生成出来的代理对象会实现对应的接口,
Retrofit:Retrofit是一个RESTful的HTTP网络请求的封装,网络请求的工作本质是OkHttp完成的。
实现方式:注解、反射、动态代理。
//获取方法上的所有注解
Annotation[] annotations = method.getAnnotations();
for(Annotation annotation:annotations){
if(annotation instanceof POST){
}
}
//获取方法参数上的所有注解
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
return proxy;
通过接收方法上的注解来区别实现的什么请求方法,然后识别请求参数的注解来区别