问题标签 [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 投票
2 回答
170 浏览

java - 其中哪一个是 Memento 设计模式的正确实现?

在 GOF Book 中,它说 Memento 设计模式的结构是这样的: GOF 纪念品图案
但是当我搜索 Wikipedia 时,它说 Memento 设计模式的结构是这样的:

两者中哪一个是正确的实现?

0 投票
2 回答
196 浏览

java - Memento模式中的“不违反封装”是什么意思

维基百科对Memento 模式的描述指出:

  • 对象的内部状态应该保存在外部,以便以后可以将对象恢复到该状态。

  • 不得违反对象的封装。

我对如何违反封装感到困惑?它是指存储在 memento 中的字段的 getter 方法吗?

0 投票
1 回答
42 浏览

java - 在java中重新分配其复制引用时更改原始对象

假设我有一个游戏类:

一个将板作为构造函数参数来初始化其字段的 Command 类:

还有我的小纪念品类,旨在在每次更改之前保存董事会的状态(它有点支持它):

问题是我的撤消方法不会将我在游戏中的棋盘状态重置为存储在堆栈中特定命令的备忘录中的状态。应该这样做是因为我将 Command 中的 board 设置为 memento 中的备用板,并且由于 Command 中的 board 是 Game 中的 board 的引用,因此后者也应该更改。

我认为这正在发生,因为当我说

我实际上是说棋盘现在指向另一个引用,因此它将不再与游戏中的棋盘有任何关系。

如果我的假设是正确的,你知道我如何让游戏中的棋盘像纪念品中的棋盘一样吗?

PS我已经简化了课程,我希望我能体面地解释我的问题。

0 投票
3 回答
359 浏览

c# - 备忘录模式和违反封装

在互联网上,我遇到了一些我认为完全不正确的备忘录模式的实现示例。它们可以用 Java 和 C# 编写。

这里有几个

  1. Memento 模式 1 的错误实现
  2. Memento 模式 2 的错误实现
  3. Memento 模式 3 的错误实现

编码:

在代码中,我留下了应该描述情况的注释。

caretaker 类可以通过 memento 读取始发者的私有字段,这违反了 memento 模式的主要原则之一:

不得违反对象的封装。

所以问题是我是对的吗?

0 投票
1 回答
196 浏览

c# - c#中的备忘录模式问题

我正在努力找出 Memento 模式的问题。虽然我理解它并且我能够实现它,但我必须遗漏一些东西,因为在我看来,如果应用于具有List类型属性的对象时会失败。

考虑以下类:

现在考虑以下代码:

所以,简而言之,我有一个 LEDTV 类型,它有一个用于大小的 ValueType、一个可用输入列表和一个用于制造商的非 ValueType。Memento 对象接受 LEDTV 来保存其状态。代码片段设置 LEDTV,保存其状态,然后对其进行一些更改,再次设置并保存其状态,再次设置,最后回滚所有保存的状态,产生以下输出:

一切都按预期工作,除了 List 属性,我显然可以理解为什么:列表不是 ValueType,所以它是通过引用传递的。对其所做的任何更改都会反映在 LEDTV 和 Memento 中,因为这两个对象中的列表相同。当然,我可以将列表内容复制到另一个列表中,从而创建一个新的列表对象,但保留构成列表的对象的所有引用,但这看起来很hacky。此外,对我来说,基本上拥有一个我想要跟踪状态的所有类的重复类似乎是不可行的,因为这基本上就是纪念品。一个理想的解决方案是一个通用的 Memento 实现,它列出一个类型的属性并保存每个属性,但是我必须通用地克服 List 问题,这乍一看似乎是不可能的。

任何帮助都将不胜感激,无论是以具体解决方案的形式,还是只是指出方式,或者只是告诉我我误解了整个概念。

0 投票
1 回答
446 浏览

design-patterns - 纪念品设计模式 - 真实世界的例子

有人可以给我一些 Memento 设计模式的真实示例吗?我听说 Cart 可以被认为是 Memento 设计模式之一。这种例子是首选。提前致谢。:)

0 投票
1 回答
45 浏览

python - 继续从类中的列表中的项目中获取 ID

当我检查列表中的项目时得到的输出:[< main .EditorState object at 0x0000017B77360040>, < main .EditorState object at 0x0000017B773600D0>, < main .EditorState object at 0x0000017B77360130>]

我想要的输出:[a,b,c]

我已经学会了如何在 java 中使用 Memento 模式,我想用 python 尝试这个模式。我确实工作,但问题是,当我从历史记录类的列表中返回最后一项时,它一直向我显示它的 id 而不是值。当我使用 getvalue() 方法打印列表时也是如此。

我尝试使用魔术方法 sush 作为strrepr但它不起作用,我也尝试将属性设置为变量但没有结果。

0 投票
0 回答
51 浏览

java - 在 java 中使用 memento 模式恢复 Vector

我正在尝试保存向量并使用 undo 方法通过使用备忘录模式来恢复向量,但它不起作用。看守者.java:

备忘录.java:

MyClass.java:

TestMemento.java:

结果:

因此,我更喜欢在撤消后更改为之前的状态。但它不起作用。在同样的情况下,我已将 Vector 更改为 int 状态

然后我可以得到结果

0 投票
0 回答
35 浏览

java - 备忘录模式撤消/重做文本编辑器

我尝试应用 memento 模式在我的 tex 编辑器应用程序中包含撤消/重做功能。假设它是简化版:)。到目前为止,我还没有弄清楚如何保存然后恢复从键盘输入的确切文本。我的意思是,我必须在我的代码中将 state 属性与 textarea 相关联,以及一些其他修改。我试图将整个代码卡在三个类中,Main、Editor、Memento,如下所示有任何提示吗?谢谢

0 投票
0 回答
4 浏览

memento - Memntodb 试图根据变量 Tansaction 计算数字(给定,采取)

输出始终为负数,将“给定”更改为“给定”不会影响输出

javascript 1.7 mementodb 安卓应用