问题标签 [memento]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
58 浏览

vb.net - 将分配保存在通过引用传递的对象中

我想确认对我一直试图理解的一些事情的扩展。

我有两种情况:

场景 1: 我有一个列表存储在我班级的私有字段中,我制作了一份深层副本并将其存储在其他私有字段中。这样做之后,我对列表进行了一些更改,但我可以选择检索其原始状态。为此,我将原始列表的副本分配给修改后的列表:

这样做,使一切按我的预期工作。

场景 2: 想法几乎相同,制作一个列表的深层副本以允许检索其原始状态。但是,在这种情况下,列表被传递给另一个对象,该对象对其进行深层复制,对其进行修改,并决定保存这些更改或恢复它们。通过这样做,我无法获得所需的行为,因为即使我进行分配“myList = myOriginalList”,列表也会更改。代码:

所以问题是……为什么?为什么我可以在第一种情况下以这种方式恢复更改,而在第二种情况下不能?为什么对作为引用传递给 ClassY 的列表所做的更改被保存,但分配没有传输到 ClassX 中的原始列表?

希望这是有道理的!谢谢!

0 投票
1 回答
2177 浏览

domain-driven-design - 快照/备忘录模式的持久性

我知道聚合根通常会重播所有事件以使自己处于正确的状态。这可能会变得低效,因此人们建议使用备忘录模式来创建聚合根的快照。我的理解是域模型与持久性无关。我也认为快照与读取模型无关。有人可以这么好心并指出快照通常保存在哪里吗?谢谢。

0 投票
1 回答
1187 浏览

java - Calculator undo 场景中对 Memento 设计模式的需求是什么

我正在阅读有关 Memento 设计模式的信息。我遇到了一个有关计算器撤消功能的示例。

我可以使用以下代码实现计算器撤消:

Calculator

CalculatorTest

Output

它适用于撤消。为什么我要在这种情况下使用 Memento 模式?

0 投票
5 回答
992 浏览

java - 在不破坏封装的情况下保存和加载对象

我想在不使用 ORM(如 Hibernate)的情况下将对象保存并加载到数据库中。

可以说我有以下课程:

该类不提供get-method,因此内部状态(年龄)被封装。

如果我想保存对象,我需要一个 getter 方法来执行以下操作:

反过来,我需要一个 setter 方法来加载对象:

但我不想打破封装(通过实现额外的 setter 和 getter 方法)只是为了保存和加载对象。

有没有可能做到这一点?也许某种模式(纪念品?)或最佳实践?

先感谢您!

0 投票
1 回答
301 浏览

c# - “Catel.IoC.IServiceLocator”不包含“实例”的定义

我对 .NET 开发和 Catel 还很陌生,但正在研究一个项目来学习它。目前原始开发人员不在场,所以我会在这里试试运气。

要实现撤消/重做,Catel 的 Memento 模式支持似乎很棒,所以尝试一下,但我在获取 MementoService 的实例时遇到了问题。当我在我的 ViewModel 中这样做时: var mementoService = ServiceLocator.Instance.ResolveType<IMementoService>(); 我得到: 'Catel.IoC.IServiceLocator' does not contain a definition for 'Instance' and no extension method 'Instance' accepting a first argument of type 'Catel.IoC.IServiceLocator' could be found (are you missing a using directive or an assembly reference?)

我注意到当我在我的模型中做同样的事情时,虽然我没有遇到这个问题。似乎很奇怪,我需要不同的方法来获取服务实例,具体取决于我尝试获取它的位置。

我不明白我做错了什么。NuGet 包管理器控制台告诉我,我安装了 Catel.Extensions.Memento 3.7 以及 Catel.Core、Catel.MVVM 和 Catel.Extensions.Controls 3.7。我正在使用带有 .NET 4.0 的 Visual Studio 2013。

0 投票
1 回答
1425 浏览

java - 为什么我们需要 Memento Pattern 中的看守类?真的那么重要吗?

我目前试图弄清楚纪念品模式是如何工作的。我坚持Caretaker上课?拥有它真的很重要吗?我的意思是我可以在没有这个类的情况下使用 Memento。请在下面查看我的代码。

这是备忘录的实现。

这段代码运行良好,Memento 完美运行。

0 投票
1 回答
83 浏览

catel - 删除 Memento 中的重做操作?

在我的应用程序中,用户可以向 DataGrid 添加行并更改每行的属性。用户还可以删除行。撤消和重做这些操作可以正常工作,但是如果用户添加行,比如三行,修改一些值,然后撤消回只有一行的位置,然后添加新行,那么能够重做撤消似乎是不合逻辑的(在最后添加的行之后出现新行)。因此,当用户添加新行时,我想删除所有重做。

我尝试使用 RedoBatches 获取所有重做的枚举,然后对每个重做执行清除以删除它们,但重做按钮仍然处于活动状态,并且在按下时将重做这些操作。

这是尝试实现这一目标的正确方法,还是不可能,或者我应该以不同的方式做?

0 投票
1 回答
168 浏览

catel - 应该如何在 Catel 中实现具有撤消/重做支持的更改状态对话框?

使用对话框时,我无法让 Undo 和 Redo 正常运行。

我有一个简单的模型,其属性指示对象的状态(running, paused, stopped),可以通过对话框进行更改。发生的情况是,我的撤消队列中似乎没有执行任何操作,或者撤消将对象恢复到中间状态。

模型对象在构造函数中用 memento 注册。该对话框具有三个单选按钮,每个按钮代表三种不同状态之一。每个单选按钮都绑定到一个命令。每个命令都会更改属性。我尝试了两种不同的方法,每个命令直接在对象中设置属性,或者每个命令在调用时为视图模型设置一个实例变量,然后我使用保存事件来修改对象。

如果使用第一种方法,如果用户在单击对话框中的“确定”之前单击了多个单选按钮,则每个属性更改都将放在“撤消”队列中。试图通过将整个对话框包装成一个批处理来解决这个问题,但这会导致状态更改撤消,对象将恢复到最后一个之前的状态,即如果属性设置为stopped在对话框打开并且用户按下之前暂停单选按钮,然后启动一个,最后确定,撤消会将属性设置为paused而不是预期的stopped.

如果使用第二种方法,用户打开对话框,将状态更改为paused,在对话框中单击“确定”,撤消/重做的行为与预期相同,但如果再次打开对话框并选择“取消”,则会向“撤消”队列添加另一个操作,即用户必须单击 Undo 两次才能回到初始stopped状态。

所以我的问题是如何正确实施以获得预期的行为;每个对话交互都可以撤消,而不是对话中的每个交互?

这是 ViewModel 的代码:

0 投票
0 回答
192 浏览

c# - 纪念品图案缺失

在我关于图像处理的项目中,我需要有撤消/重做按钮。简而言之,我对位图执行多项操作,然后将其分配给图片框。我发现这篇文章http://www.codeproject.com/Articles/10576/An-Undo-Redo-Buffer-Framework 我根据示例代码创建了我的 Originator。

看起来像这样

但是当我试图为它分配一个位图对象时,编译器正在发送一个错误消息。

你能帮帮我吗,很抱歉我的英语不好。

0 投票
2 回答
291 浏览

java - 纪念品模式无法正常工作

我尝试在 Java 中实现Memento 模式的一些实现。

示例很简单 - 以复制视频游戏为例,当用户按下F5保存玩家状态 => 按下F9恢复上次保存的玩家状态后。

这是轻松运行的输出:

但这是错误的结果,因为最后两行应该是:

我无法弄清楚出了什么问题。代码看起来不错。

这是代码片段:

有什么建议么?