代理模式

Posted mabaoqing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。

静代理模式

  • 真实角色

  • 代理角色(自定义)

  • 两个角色实现同一接口

  • 实现方式:继承 VS 聚合(构造方法为真实对象赋值)
  • 例:线程Thread

// 产生一个代理对象
Thread proxy = new Thread(new Runnable() {
     public void run() {}
});
// 调用代理对象的方法
proxy.start();

技术图片

动态代理:

  • 基于接口:jdk自带的动态代理

    • java.lang.reflect.Proxy类提供用于创建动态代理类和实例的静态方法

    • java.lang.reflect.InvocationHandler接口

      • 通过 invoke() 实现对真实角色的代理访问
      • 每次通过Proxy生成代理对象时都要指定对应的InvocationHandler对象
public class ProxyInvocationHandler implements InvocationHandler {
  //真实对象
  private Object target;
  public ProxyInvocationHandler(Object target) {
     this.target = target;
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     System.out.println("代理方法开始.....");

     Object result = method.invoke(target, args);
     System.out.println("代理方法结束.....");
     return result;

  }

}
// 测试方法
public void test() {
  Role realRole = new RealRole();
  ProxyInvocationHandler handler = new ProxyInvocationHandler(realRole);

  // 生成代理类

  Role proxy = (Role) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),realRole.getClass().getInterfaces(),handler);
  // 实际上会调用 handler 的 invoke 方法

  proxy.sing();

}
  • 基于类:cglib
  • 使用 javassist 生成动态代理

以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

用于从 cloudkit 检索单列的代码模式/片段

java代码实现设计模式之代理模式

代理模式(静态代理动态代理)代码实战(详细)

Java设计模式-代理模式之动态代理(附源代码分析)

代理模式(静态代理)