代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。
她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人。
代理模式(proxy Pattern) - 图1
按理说,顾客可以直接从厂家购买产品,但是现实生活中,很少有这样的销售模式。一般都是厂家委托给代理商进行销售,顾客跟代理商打交道,而不直接与产品实际生产者进行关联。

代理模式

代理模式(proxy Pattern) - 图2

需要注意的有下面几点:

:::info

  • 用户只关心接口功能,而不在乎谁提供了功能。上图中接口是 Subject。
  • 接口真正实现者是上图的 RealSubject,但是它不与用户直接接触,而是通过代理,用户与代理直接的接触。
  • 代理就是上图中的 Proxy,由于它实现了 Subject 接口,所以它能够直接与用户接触。
  • 用户调用 Proxy 的时候,Proxy 内部调用了 RealSubject。所以Proxy 是中介者,它可以增强 RealSubject 操作。 :::

静态代理

举一个生活中的例子:比如用户从报社订阅报纸,报社和用户之间是一对多依赖,用户可以在报社订阅(register)报纸,报社可以把最新的报纸发给用户(notify),用户自动收到更新。在用户不需要的时候还可以取消注册(remove)。

动态代理

Proxy源码

  1. /*
  2. * 通过Proxy的newProxyInstance方法来创建代理对象
  3. * 第一个参数 handler.getClass().getClassLoader() ,使用handler这个类的ClassLoader对象来加载代理对象(AppClassLoader)
  4. * 第二个参数 realSubject.getClass().getInterfaces(),为代理对象提供的接口是真实对象所实行的接口,表示代理的是该真实对象,这样就能调用这组接口中的方法了
  5. * 第三个参数 handler,将这个代理对象关联到了上方的 InvocationHandler 这个对象上
  6. */
  7. Hello helloProxy = (Hello)Proxy.newProxyInstance(handler.getClass().getClassLoader(),
  8. helloImpl.getClass().getInterfaces(), handler);

参考

https://juejin.im/entry/57f25c16da2f60004f675fd8 https://blog.csdn.net/itachi85/article/details/50773358