Java 代理和纪念品模式

Java 代理和纪念品模式,java,design-patterns,proxy-pattern,memento,Java,Design Patterns,Proxy Pattern,Memento,代理-什么代码和位置将ProxyService转换为RealService调用?为什么/什么时候使用这个? 层-如何实现? Memento-为什么不将状态持久化到缓存或文件 我对代理模式的理解是,您有某种服务接口,它具有ProxyService和RealService的具体化。由于某些原因,您无法访问RealService,因此您需要针对ProxyService实例编写代码,然后让框架将代理链接到您服务的真实实例。只有两个问题: 我想不出一个例子,当我可以访问服务和代理服务,但不能访问RealS

代理-什么代码和位置将ProxyService转换为RealService调用?为什么/什么时候使用这个? 层-如何实现? Memento-为什么不将状态持久化到缓存或文件

我对代理模式的理解是,您有某种服务接口,它具有ProxyService和RealService的具体化。由于某些原因,您无法访问RealService,因此您需要针对ProxyService实例编写代码,然后让框架将代理链接到您服务的真实实例。只有两个问题:

我想不出一个例子,当我可以访问服务和代理服务,但不能访问RealService时——有人能提供关于何时可能发生这种情况的例子吗?
这与纪念图案有何不同?我对Memento定义的理解是,它用于保存对象状态,这就是代理的真正作用,是吗?如果没有,请解释Memento与Proxy的区别!提前谢谢

代理是指当某人期待某个对象时,你对他撒谎,然后你说:是的,你有你的对象,但你实际上是在给他其他东西。。。 代理服务器的常见用途: 实现延迟初始化:要求您提供一个表示大文件内容的对象,或者一些获取成本非常高的对象,您知道此时不需要它,或者实际上可能永远不会真正使用它。因此,您传递一个代理,它只会在100%完全必要时获取资源。您也可以开始错误地获取资源,并使使用代理的进程只在真正需要时才开始等待。这在ORMs中非常常见。还要实现类似这样的功能 要拦截呼叫: 你可以传递一个真正知道真实对象的代理,拦截它得到的调用,做一些有趣的事情,比如记录它们,更改其中的一些,等等。。。 代理还有很多高级和复杂的用法,因为您通常能够在运行时确定行为。很抱歉退出Java,但在C中,用于实现模拟对象以进行测试。您还可以使用代理实现类似的功能。您可以使用代理在静态语言中模拟许多动态语言特性。您还可以使用一个代理来评估一段代码,该代理实际记录所做的每个调用,并每次返回新的代理,以便通过执行它来重建原始源代码


纪念图案:完全是另一回事。当您想要处理对象、将其保存为当前状态、计算处理该对象的次数时,您可以使用它,过一段时间后,您可能想要选择回滚到上一个状态。您可以使用它在对象中实现事务性行为,因为很难通过代码撤消这些操作。您可以使用此工具实现撤消和重做功能。不保存更改增量,而是保存完整状态。您可以在模拟中使用它,每次从同一点开始,您可以说源版本服务器每隔一段时间使用memento[它们通常使用memento+增量更改的组合]。虚拟机的快照或计算机的休眠也是memento模式的一种用法。保存某个东西的状态,这样你就可以重现完全相同的情况也是一种纪念。

代理是指当有人期待某个东西时,你对他撒谎,你说:是的,你有你的东西,但实际上你给了他其他东西。。。 代理服务器的常见用途: 实现延迟初始化:要求您提供一个表示大文件内容的对象,或者一些获取成本非常高的对象,您知道此时不需要它,或者实际上可能永远不会真正使用它。因此,您传递一个代理,它只会在100%完全必要时获取资源。您也可以开始错误地获取资源,并使使用代理的进程只在真正需要时才开始等待。这在ORMs中非常常见。还要实现类似这样的功能 要拦截呼叫: 你可以传递一个真正知道真实对象的代理,拦截它得到的调用,做一些有趣的事情,比如记录它们,更改其中的一些,等等。。。 代理还有很多高级和复杂的用法,因为您通常能够在运行时确定行为。很抱歉退出Java,但在C中,用于实现模拟对象以进行测试。您还可以使用代理实现类似的功能。您可以使用代理在静态语言中模拟许多动态语言特性。您还可以使用一个代理来评估一段代码,该代理实际记录所做的每个调用,并每次返回新的代理,以便通过执行它来重建原始源代码

纪念图案:完全是另一回事。如果要使用对象,请将其保存为当前状态
e、 计算使用该对象执行任务的次数,一段时间后,您可能希望选择回滚到以前的状态。您可以使用它在对象中实现事务性行为,因为很难通过代码撤消这些操作。您可以使用此工具实现撤消和重做功能。不保存更改增量,而是保存完整状态。您可以在模拟中使用它,每次从同一点开始,您可以说源版本服务器每隔一段时间使用memento[它们通常使用memento+增量更改的组合]。虚拟机的快照或计算机的休眠也是memento模式的一种用法。保存某些东西的状态,这样你就可以重现完全相同的情况,这也是一种纪念。

首先,我要警告我的回答,我不相信关于模式有任何硬性规定——你只需要从它们那里得到你需要的,别的什么都没有。毫无疑问,我使用某些模式的方式与其他开发人员可能选择使用它们的方式不同。也就是说,这是我对你的问题的看法

代理模式解释

根据我对代理设计模式的了解,您可以使用它做两件事:

限制对特定对象实例的其他公共方法的访问 通过在对代理的第一次调用中实例化具体对象,然后将对代理的所有进一步调用传递到您的代理创建的具体实例,可以避免其他昂贵且不必要的实例化成本。 也许RealService有一个方法非常危险,您想隐藏它。或者更为无害的是,也许RealService有几百个方法,您不需要每次键入时都看到这些方法。在RealService实例的变量名之后。你可以用一个代理来做这一切

为了进一步阅读,本文提供了很多有用的信息:

与纪念图案的区别

Memento模式允许您通过将中间状态存储在具体对象旁边,将对象回滚到其原始状态或以前的某个状态。有点像编程的撤销。您可能会使用代理模式来实现Memento,但代理并不能保证对象状态的保存或回滚—它只允许您在再次实例化该对象的成本过高时引用同一对象进行方法调用


所以希望这能有所帮助——我喜欢把Memento看作是一个功能更全面的代理版本,但并不是所有的代理实现都是Memento。

首先,我要警告一下,我的回答是,我不相信关于模式有任何硬性规定——你从它们那里得到了你需要的东西,什么都没有。毫无疑问,我使用某些模式的方式与其他开发人员可能选择使用它们的方式不同。也就是说,这是我对你的问题的看法

代理模式解释

根据我对代理设计模式的了解,您可以使用它做两件事:

限制对特定对象实例的其他公共方法的访问 通过在对代理的第一次调用中实例化具体对象,然后将对代理的所有进一步调用传递到您的代理创建的具体实例,可以避免其他昂贵且不必要的实例化成本。 也许RealService有一个方法非常危险,您想隐藏它。或者更为无害的是,也许RealService有几百个方法,您不需要每次键入时都看到这些方法。在RealService实例的变量名之后。你可以用一个代理来做这一切

为了进一步阅读,本文提供了很多有用的信息:

与纪念图案的区别

Memento模式允许您通过将中间状态存储在具体对象旁边,将对象回滚到其原始状态或以前的某个状态。有点像编程的撤销。您可能会使用代理模式来实现Memento,但代理并不能保证对象状态的保存或回滚—它只允许您在再次实例化该对象的成本过高时引用同一对象进行方法调用

因此,希望这能有所帮助——我喜欢将Memento看作是一个功能更全面的代理版本,但并不是所有代理实现都是Memento