代理模式在Android源码(Context)或者第三方框架(retrofit)还是hook技术实现都有应用
- 接口
/**
* @Author maoqitian
* @Description 汽车工厂接口 生产汽车方法
* @Date 2020/5/15 0015 11:00
**/
public interface ICarFactory {
void makeCar();
}
- 被代理的对象
/**
* @author maoqitian
* @Description 真正生产汽车的工人 被代理的对象
* @create 2020-05-15 11:03
*/
public class CarMaker implements ICarFactory {
@Override
public void makeCar() {
System.out.println("我是汽车生产商,现在生产了一辆汽车");
}
}
- 静态代理
/**
* @author maoqitian
* @Description 汽车销售 代理对象 代理了 CarMaker 静态代理
* @create 2020-05-15 11:06
*/
public class SellCar implements ICarFactory {
private ICarFactory carMaker;
public SellCar(ICarFactory carMaker){
this.carMaker = carMaker;
}
public void buyCar(){
System.out.println("这边有客人下单了一辆宝马M3车迷限定版");
makeCar();
System.out.println("你的车已经下单");
}
@Override
public void makeCar() {
carMaker.makeCar();
}
}
- 测试
//被代理对象
CarMaker carMaker = new CarMaker();
//静态代理
//去到4S店
SellCar sellCar = new SellCar(carMaker);
//买车
sellCar.buyCar();
- 结果打印
> Task :TestProxy.main()
买一辆宝马M3车迷限量版
这边有客人下单了一辆宝马M3车迷限定版
我是汽车生产商,现在生产了一辆汽车
你的车已经下单
- 实现InvocationHandler接口
/**
* @author maoqitian
* @Description 动态代理 汽车生产 CarMaker(汽车生产实现可以自由定义)
* @create 2020-05-15 11:43
*/
public class DynamicCarProxy implements InvocationHandler {
private Object mObject;
public DynamicCarProxy(Object object){
this.mObject = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//添加自己处理
System.out.println("动态代理1,有客人下单了一辆车,下单工厂去生产");
//生产被代理类
Object invoke = method.invoke(mObject, args);
System.out.println("动态代理1,汽车生产成功");
return invoke;
}
}
- 测试
//动态代理 实现 InvocationHandler 接口
ICarFactory iCarFactory = (ICarFactory) Proxy.newProxyInstance(ICarFactory.class.getClassLoader(),new Class<?>[]{ICarFactory.class},new DynamicCarProxy(carMaker));
iCarFactory.makeCar();
- 结果打印
> Task :TestProxy.main()
买一辆宝马M3车迷限量版
动态代理,这边有客人下单了一辆宝马M3车迷限定版
我是汽车生产商,现在生产了一辆汽车
动态代理,你的车已经下单