代理和动态代理模式之间的差异

时间:2013-12-14 14:07:33

标签: java design-patterns dynamic-proxy proxy-pattern

我试图了解代理和动态代理模式之间的区别。 从我到目前为止所读到的,我发现的唯一事情是代理类字节代码是在编译期间创建的,而动态代理是在运行时创建的。 我还缺少另一个差异吗?如果不是那么更喜欢代理而不是动态代理的原因是什么(性能问题除外)

2 个答案:

答案 0 :(得分:9)

动态代理本质上是代理设计模式,其中代理对象是在运行时动态创建的。

代理设计模式使用代理,它充当客户端和底层真实对象之间的中介。在将请求委托给真实对象之前,程序员可以在代理中执行访问控制,验证和附加操作。

现在假设您要执行一些通用操作beform调用任何类的任何方法,例如,您希望保留客户端进行的所有方法调用的日志。 在这种情况下,如果要实现代理设计模式,步骤如下:

  1. 为每个班级创建代理类。
  2. 以某种方式实现代理类,首先它创建客户端进行方法调用的日志条目,而不是将调用委托给真实对象。
  3. 上述技术的问题在于,假设您有1000个类,您需要为每个类编写1000个代理类,并在所有类中实现基本上做同样事情的所有方法(执行日志记录操作)在我们的例子中),这是一个非常乏味的过程和浪费的记忆。

    不管怎样更好,如果在运行时以某种方式,我们能够在委托调用之前基于客户端的调用创建代理对象,然后执行通用操作(在我们的案例中记录操作)对于真实的对象,以及动态代理的作用。

    动态代理的过程如下:

    1. 客户端对某个对象调用一些操作。
    2. 系统根据客户的调用在运行时创建代理对象。
    3. 代理对象调用通用方法,以便在每次调用时执行通用操作。
    4. 在操作之后,代理对象将调用委托给真实对象。
    5. 所以简而言之,如果你要执行一些通用操作,请使用动态代理,但是如果你希望每个类都被区别对待(在某些类中执行日志记录,在某些类中,在某些访问控制中)等)使用简单的代理。 希望我帮忙。如果您需要代码示例,请告诉我。

答案 1 :(得分:1)

我将尝试提供有关Java的动态代理和经典代理模式的信息。实际上,Java的动态代理也是代理模式的一个例子。

在动态代理案例中,代理类是在运行时创建的,您可以使用InvocationHandler来定义其行为。这意味着动态代理类使用InvocationHandler作为其策略,并将调用委托给其InvocationHandler。

在经典代理模式中,您可以显式创建代理类并在此处实现逻辑。 您可以查看here样本代码。