java - 代理和纪念品模式

标签 java design-patterns proxy-pattern memento

Proxy - 什么代码(以及在哪里)将 ProxyService 转换为 RealService 调用?为什么/何时使用这个? 层 - 如何实现? 纪念品 - 为什么不将状态持久保存到缓存或文件中?

我对 Proxy 模式的理解是,您拥有某种具有 ProxyServiceRealServiceService 接口(interface)> 结石。出于某种原因,您无法访问 RealService,因此您针对 ProxyService 实例进行编码,然后让框架将代理链接到服务的真实实例。只有两个问题:

  • 我想不出一个例子,我可以访问 ServiceProxyService,但不能访问 RealService - 有人可以提供关于何时可能发生的示例?

这与 Memento 模式有何不同?我对 Memento 定义的理解是,它用于保存对象状态,这就是 Proxy 真正在做的事情,是吗?如果不是,请解释 Memento 与 Proxy 有何不同!提前致谢!

最佳答案

首先,我要声明我的回答是,我不相信关于模式有任何硬性规定 - 您可以从中获取所需的内容,仅此而已。我使用某些模式的方式无疑不同于其他开发人员可能选择使用它们的方式。也就是说,这是我对你的问题的看法。

代理模式解释

据我了解 Proxy 设计模式,您可以使用它来做两件事:

  1. 限制对特定对象实例的其他公共(public)方法的访问
  2. 通过在第一次调用代理时实例化具体对象,然后将对代理的所有进一步调用传递给您的代理创建的具体实例,来避免昂贵和不必要的实例化成本。

也许 RealService 有一个您想要隐藏的方法 doSomethingReallyDangerous()。或者更无伤大雅,也许 RealService 有数百个方法,您不需要在每次键入 . 后都看到这些方法 RealService 实例的变量名。您将为此使用代理。

为了进一步阅读,这篇文章有很多有用的信息:

http://sourcemaking.com/design_patterns/proxy

与纪念品模式的区别

Memento 模式允许您通过将中间状态与具体对象一起存储来将对象回滚到其原始状态或某个先前状态。有点像编程的“撤消”。您可能会使用 Proxy 模式来实现 Memento,但是 Proxy 不保证保存对象状态或回滚 - 它只是让您如果再次实例化该对象的成本过高,则引用同一对象进行方法调用。

希望这能有所帮助 - 我喜欢将 Memento 视为功能更全面的 Proxy 版本,但不是所有 Proxy 实现是纪念品

关于java - 代理和纪念品模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404327/

相关文章:

objective-c - 对 Objective-c View 、代表和导出的混淆

javascript - 混合构造函数并在 Javascript 代理对象上应用陷阱

laravel - Laravel 中的 Facade 是否实现了 Facade 或 Proxy 模式?

java - 有没有命令行javadoc查询工具?

java - 修改 Java SWT 浏览器用户代理

design-patterns - 如果发生任何故障,Saga 模式是否能够帮助逆转支出?

c# - ViewModel 的版本控制

Python代理类

跨对象的 Java 同步

java - Hibernate网站显示版本3.5,maven只显示3.1rc2