oop - 代理设计模式:与接口或 RealSubject 的关联
问题描述
我目前正在学习代理模式,并在两本不同的书中找到了它的两种不同实现。请查看模式 UML 图的链接,因为我还不能嵌入图片。
我的老师说模式 1 是正确的实现,尽管大多数教程和资源都使用模式 2 实现。我的老师认为模式 2 是错误的,因为“它允许代理调用 RealSubject 上的所有公共方法,这使得它与适配器模式没有真正的不同”,而模式 1“强制代理只能调用来自真实主体内的接口类"
我的问题是:
- 这两个 UML 图之间的真正区别是什么?它们本质上不是表现出同样的东西吗?
- 如果模式 2 是错误的,为什么包括书籍在内的大多数资源都使用它来显示代理模式?
谢谢您的回答。
解决方案
两个图之间的区别在于,在 #1 中 Proxy 引用了 Subject 接口,而在 #2 中 Proxy 引用了具体的 Subject 实现(也称为RealSubject)。
这两个图都是正确的,因为四人组代理模式涵盖了许多不同的用例:在第 208 页,他们将远程代理、虚拟代理、保护代理和智能引用列为同一模式的不同实现。这些实现在某种程度上有所不同,其中一些知道它们的具体主题,而另一些则不知道。
这种对具体主题的意识或无知之间的区别通常会导致对代理模式和装饰器模式之间差异的混淆。不应将 Proxy 与 Adapter 混淆;因为在适配器模式中,客户端和主题具有完全不同的接口(因此需要适配器)。代理(和装饰器)与其客户端和主题共享一个公共接口。
推荐阅读
- android - 将“zip”文件从 Android 设备发送到 Web 服务 Rest
- android - 如何打包我的 Android 库,以便我的客户不会遇到像“AAPT:错误:属性 layout_behavior”这样的错误
- reactjs - React-Redux-Saga history.push 正在更新 url,但没有加载组件
- c# - 为什么 char.Equals() 方法不适用于“.”、“+”、“-”、“/”或“*”
- reactjs - React Native 纸张搜索栏在按键时关闭键盘
- java - 颤振运行时颤振应用程序构建失败
- oracle - 如何在 ODI MAPPING 中的分区上使用行号
- python - 如何在python中将字典列表中的键值向上移动一级
- python - 是否有理由解开列表然后将其放回列表中?
- java - Avro 编码器 NullPointerException