代理模式

来自智得网
跳转至: 导航、​ 搜索

简介

代理模式(Proxy)是一种常用的设计模式,该模式一般情况下通过组合的方式包装了实际的服务提供方。

代理模式中增加了代理的角色,代理类似于中介横在客户端和服务提供方之间,客户端通过代理对象访问目标对象,屏蔽了实际的目标对象。

除了中介功能之外,代理模式通常可以在目标对象实现的基础上会增加扩展的功能,这些功能一般是横向的功能,例如权限,日志等功能。代理模式可以不修改实际的服务提供方而通过代理实现这些通用的功能,符合软件设计中的开闭原则。

原理

代理模式

代理模式有两种实现,分别是静态代理或者动态代理。

静态代理

静态代理一般和目标服务对象提供类似的接口,但是实际的执行逻辑一般通过组合实际的目标提供方来实现,而代理提供扩展的功能。

动态代理

动态代理不需要手动实现静态代理中的接口逻辑,而可以通过反射或者字节码技术自动生成代理的实现类。

JVM内置了动态代理的方案,一般使用Proxy类的 newProxyInstance 方法:

public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)

而扩展方法通常使用 InvocationHandler 来实现:

public interface InvocationHandler {

    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

但是JVM提供的动态代理方案需要被扩展的服务提供者必须定义有接口,如果希望对没有接口的类进行扩展,可以使用字节码技术,例如AspectJ等。

Spring中AOP的实现就是通过动态代理实现的。