代理设计模式:与接口或 RealSubject 的关联
Proxy Design Pattern: Association to the Interface or to RealSubject
我目前正在学习代理模式,并在两本不同的书中找到了它的两种不同实现。请查看模式 UML 图的链接,因为我还不能嵌入图片。
Pattern 1
Pattern 2
我的老师说模式 1 是正确的实现,尽管大多数教程和源代码都使用模式 2 实现。我的老师认为模式 2 是错误的,因为“它允许代理调用 RealSubject 上的所有 public 方法,这使得它与适配器模式没有太大区别”,而模式 1“强制代理只能调用真实主题中接口 class 的功能
我的问题是:
- 这两个 UML 图之间的真正区别是什么?本质上不是表现的一样吗?
- 如果模式 2 是错误的,为什么包括书籍在内的大多数资源都使用它来显示代理模式?
感谢您的回答。
两个图的不同之处在于,在#1 中,Proxy 引用了 Subject 接口,而在#2 中,Proxy 引用了具体的 Subject 实现(a.k.a。RealSubject).
这两个图都是正确的,因为四人组代理模式涵盖了许多不同的用例:在第 208 页上,他们列出了 远程代理、虚拟代理、保护代理和智能引用作为同一模式的不同实现。实施方式各不相同,其中一些人知道他们的具体主题,而另一些人则不知道。
这种对具体主题的认识或无知之间的区别常常导致对 differences between the Proxy and Decorator patterns 的混淆。它不应该混淆 Proxy 和 Adapter;因为在 Adapter 模式中,Client 和 Subject 具有完全不同的接口(因此需要 Adapter)。代理(和装饰器)与其客户端和主题共享一个公共接口。
我目前正在学习代理模式,并在两本不同的书中找到了它的两种不同实现。请查看模式 UML 图的链接,因为我还不能嵌入图片。
Pattern 1
Pattern 2
我的老师说模式 1 是正确的实现,尽管大多数教程和源代码都使用模式 2 实现。我的老师认为模式 2 是错误的,因为“它允许代理调用 RealSubject 上的所有 public 方法,这使得它与适配器模式没有太大区别”,而模式 1“强制代理只能调用真实主题中接口 class 的功能
我的问题是:
- 这两个 UML 图之间的真正区别是什么?本质上不是表现的一样吗?
- 如果模式 2 是错误的,为什么包括书籍在内的大多数资源都使用它来显示代理模式?
感谢您的回答。
两个图的不同之处在于,在#1 中,Proxy 引用了 Subject 接口,而在#2 中,Proxy 引用了具体的 Subject 实现(a.k.a。RealSubject).
这两个图都是正确的,因为四人组代理模式涵盖了许多不同的用例:在第 208 页上,他们列出了 远程代理、虚拟代理、保护代理和智能引用作为同一模式的不同实现。实施方式各不相同,其中一些人知道他们的具体主题,而另一些人则不知道。
这种对具体主题的认识或无知之间的区别常常导致对 differences between the Proxy and Decorator patterns 的混淆。它不应该混淆 Proxy 和 Adapter;因为在 Adapter 模式中,Client 和 Subject 具有完全不同的接口(因此需要 Adapter)。代理(和装饰器)与其客户端和主题共享一个公共接口。