首页 > 解决方案 > 代理设计模式:与接口或 RealSubject 的关联

问题描述


我目前正在学习代理模式,并在两本不同的书中找到了它的两种不同实现。请查看模式 UML 图的链接,因为我还不能嵌入图片。

模式 1

模式 2

我的老师说模式 1 是正确的实现,尽管大多数教程和资源都使用模式 2 实现。我的老师认为模式 2 是错误的,因为“它允许代理调用 RealSubject 上的所有公共方法,这使得它与适配器模式没有真正的不同”,而模式 1“强制代理只能调用来自真实主体内的接口类"

我的问题是:

  1. 这两个 UML 图之间的真正区别是什么?它们本质上不是表现出同样的东西吗?
  2. 如果模式 2 是错误的,为什么包括书籍在内的大多数资源都使用它来显示代理模式?

谢谢您的回答。

标签: oopdesign-patternsproxy-pattern

解决方案


两个图之间的区别在于,在 #1 中 Proxy 引用了 Subject 接口,而在 #2 中 Proxy 引用了具体的 Subject 实现(也称为RealSubject)。

这两个图都是正确的,因为四人组代理模式涵盖了许多不同的用例:在第 208 页,他们将远程代理虚拟代理保护代理智能引用列为同一模式的不同实现。这些实现在某种程度上有所不同,其中一些知道它们的具体主题,而另一些则不知道。

这种对具体主题的意识或无知之间的区别通常会导致对代理模式和装饰器模式之间差异的混淆。不应将 Proxy 与 Adapter 混淆;因为在适配器模式中,客户端和主题具有完全不同的接口(因此需要适配器)。代理(和装饰器)与其客户端和主题共享一个公共接口。


推荐阅读