Skip to content

Latest commit

 

History

History
144 lines (113 loc) · 3.46 KB

File metadata and controls

144 lines (113 loc) · 3.46 KB

代理模式

代理模式在Android源码(Context)或者第三方框架(retrofit)还是hook技术实现都有应用

类图

image

静态代理 (编译时确定)

  • 接口
/**
  * @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车迷限定版
我是汽车生产商,现在生产了一辆汽车
动态代理,你的车已经下单

原理分析参考

demo源码地址