「手写设计模式」代理模式

214 阅读1分钟

理解名词

代理模式(Proxy Design Pattern)是一种结构型设计模式,代理在这里理解为代替原始类与外界进行交互(接收请求返回结果)

作用

在不改变原始类(被代理类)代码的情况下,通过引入代理类来给原始类附加功能。

应用场景

  • 非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。
  • RPC、缓存

代码示例

实现一个方法调用耗时统计的功能


public class MetricsCollectorProxy {

  public Object createProxy(Object proxiedObject) {
    Class<?>[] interfaces = proxiedObject.getClass().getInterfaces();
    DynamicProxyHandler handler = new DynamicProxyHandler(proxiedObject);
    return Proxy.newProxyInstance(proxiedObject.getClass().getClassLoader(), interfaces, handler);
  }

  private class DynamicProxyHandler implements InvocationHandler {
    private Object proxiedObject;

    public DynamicProxyHandler(Object proxiedObject) {
      this.proxiedObject = proxiedObject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      long startTimestamp = System.currentTimeMillis();
      Object result = method.invoke(proxiedObject, args);
      long endTimeStamp = System.currentTimeMillis();
      long responseTime = endTimeStamp - startTimestamp;
      String apiName = proxiedObject.getClass().getName() + ":" + method.getName();
      
      // 打印或上报apiName,responseTime...
      
      return result;
    }
  }
}

使用示例

MetricsCollectorProxy proxy = new MetricsCollectorProxy();
IUserController userController = (IUserController) proxy.createProxy(new UserController());

业界经典实现

  • Spring AOP