前言:做过Android开发的一般都使用过Retrofit这个三方框架,初一使用,会觉得很神奇:为什么把各个请求定义在一个接口里,通过几行代码就能实现网络请求?答案就是“动态代理”!
何为代理?
简单来说代理是一种软件设计模式,某些情况下,我们不希望修改已有对象的功能,但是我们又想在不改变调用者调用方法的情况下,改变调用后的具体实现逻辑,因此,我们会采用间接访问来实现目的。比如A类实现了IHelloWorld接口,有一个helloWorld方法,但在使用的时候并不直接调用a.helloWorld(),而是通过定一个同样实现了IHelloWorld接口的代理类B,在B的helloWorld方法中调用A的helloWorld方法,并夹带一些自己的私货。
//共同实现的接口
public interface IHelloWorld {
public void helloWorld(String str);
}
//真实对象
public class RealSubject implements IHelloWorld {
@Override
public void helloWorld() {
System.out.println("RealSubject say hello world");
}
}
//代理对象
public class Proxy implements IHelloWorld {
private IHelloWorld subject;
public Proxy(IHelloWorld subject) {
this.subject = subject;
}
@Override
public void helloWorld() {
//代理类的私货
System.out.println("Proxy say hello world");
//被代理对象的真实调用
subject.helloWorld();
}
}
//实际调用
public static void main(String[] args) {
//被代理的对象
RealSubject realSubject = new RealSubject();
//代理类对象
Proxy proxy = new Proxy(realSubject);
//调用代理类对象的方法
proxySubject.helloWorld();
}
一般的代理,就是这样的逻辑和实现。但是,如果如果需要代理的方法成百上千,总不能每一个方法都写一遍吧