代理模式和动态代理模式的区别

11

我想了解代理模式和动态代理模式之间的区别。从我目前所读的内容来看,唯一发现的是:代理类的字节码在编译时创建,而动态代理的字节码在运行时创建。还有其他差别吗?如果没有,那么除了性能问题外,为什么要优先选择代理模式而不是动态代理模式呢?

2个回答

18

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

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

假设你想在调用任何类的方法之前执行一些通用操作,例如记录客户端进行的所有方法调用。 在这种情况下,如果您想实现代理设计模式,请按以下步骤进行:

  1. 为每个类创建代理类。
  2. 以这样一种方式实现代理类,即首先记录客户端进行的方法调用,然后委托调用给真实对象。

上述技术的问题在于,假设您有1000个类,您需要为每个类编写1000个代理类,并在所有类的所有方法中实现它们所做的相同操作(在我们的案例中执行日志记录操作),这是非常繁琐和浪费内存的过程。

那么,如果我们能够在运行时基于客户端的调用创建代理对象,并在将调用委托给真实对象之前执行通用操作(在我们的案例中执行记录操作),那不是更好吗?这就是动态代理的作用。

动态代理的过程如下:

  1. 客户端调用对象上的某个操作。
  2. 系统根据客户端的调用在运行时创建代理对象。
  3. 代理对象调用通用方法以执行每个调用的通用操作。
  4. 操作后,代理对象委托调用给真实对象。

总之,如果您要执行某些通用操作,请使用动态代理;但是,如果您希望将每个类视为不同(在某些类中执行日志记录,在某些类中不执行,在某些类中进行访问控制等),请使用简单代理。 希望我能帮到您。如果您需要代码示例,请告诉我。


感谢@ugrasen-banchhor,您的解释正是我想要实现的。就像ActorProxy<IExample>.Create()一样,然后我将获得IExample的代理对象...所以如果您能分享您解释背后的代码示例,那就太好了。 - Vu Pham

1
我将尝试提供有关Java的动态代理和经典代理模式的信息。实际上,Java的动态代理也是代理模式的一个例子。
在动态代理中,代理类是在运行时创建的,并使用InvocationHandler来定义其行为。这意味着动态代理类使用InvocationHandler作为其策略,并将调用委托给其InvocationHandler。
在经典代理模式中,您明确创建代理类并在此处实现逻辑。您可以查看这里获取示例代码。

没错。不过需要澄清的是,在动态代理模式中,InvocationHandler 需要由代理类实现,并且实际的方法调用将被委托给 Inoveker() 方法。 - mykey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接