问题标签 [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.
c# - 撤消/重做备忘录模式c#
我正在尝试在 C#(treeView 组件)中为树的节点实现撤消/重做功能。我使用了纪念品模式,但我在重做部分遇到了麻烦。我看不出我的逻辑在哪里有缺陷。这是代码的一些快照
在我的表单中,在删除节点之前,我调用了 SaveMemento() 方法,该方法创建了一个表示当前状态的新 Memento 对象。该对象被添加到 _mementoStateList。
当撤消和重做一个动作时,我调用上面的 Undo() 和 Redo() 方法。
我假设我没有在正确的时刻保存状态?任何输入都非常感谢!
java - 为什么要使用 Memento 模式,而它可以更容易完成?
为什么说 Memento 在不违反封装的情况下完成了它的工作,而我可以实现简单的方法但又不违反封装?备忘录有什么用?我有一个示例程序,它将在用户按下保存按钮时保存学生详细信息,并在用户按下然后撤消按钮时撤消操作。
下面的示例代码是不使用 Memento 模式的实现:
Student.java
主.java
上面的示例代码完美运行,但为什么我们需要 memento 而它可以如此轻松地完成呢?我没有看到上面的实现在哪里破坏了封装......
总结
上面的方法是否违反了封装?如果不是,那么 Memento 的目的是什么?允许多次撤消?虽然上面的实现不允许多次撤消,但也可以在不应用备忘录的情况下完成。
java - 如何在 Kotlin 中实现备忘录模式
我目前正在尝试在 Kotlin 中实现一些设计模式作为练习,但我有点坚持使用“Memento”模式。我的参考资源是SourceMaking: Memento。
我想实现这个结构:
在遵循他们的“清单”时
- 确定“看守人”和“发起人”的角色。
- 创建一个 Memento 类并将创建者声明为朋友。
- 看守者知道何时“检查点”发起者。
- Originator 创建一个 Memento 并将其状态复制到该 Memento。
- 看守人抓住(但不能窥视)纪念品。
- 看守者知道何时“回滚”发起者。
- Originator 使用 Memento 中保存的状态恢复自身。
我无法让第 5 步工作。如何制作一个Memento
对象,其字段可以从Originator
实例内部读取,但对Caretaker
?
我已经在 Java 中成功实现了这一点,如下所示:
和一个看护人
因为它们是内部类,所以我可以从我的实例中读取私有字段Memento
,但对于我的实例来说是完全不透明的(仅显示s 成员函数)。State
Originator
Caretaker
Memento
Object
现在我如何在 Kotlin 中实现这种确切的行为?基本上我错过了读取内部类私有字段的功能。
我能想到的最接近的事情是:
这具有Memento
对我的实例完全不透明的预期效果Caretaker
,但我也无法从Originator
其中读取字段。
顺便说一句,这段代码与应用于我的 Java 代码的 IntelliJ 的“将 Java 转换为 Kotlin”功能生成的代码几乎完全相同(而且它显然也不能编译)。
那么我在这里遗漏了什么明显(或神奇)的东西吗?也许不是类图中显示的结构?或者这些确切的规范不能在 Kotlin 中实现吗?
另一个注意事项:Memento 对象的不透明性要求实际上是 Memento 模式的通俗接受的属性,还是 SourceMaking 提出了这个要求?
javascript - 备忘录还是命令模式?
我有一个 JavaScript 网络应用程序(我的模型为 Backbone,我的视图为 ReactJS),它有两种“显示模式”,用户可以使用按钮在它们之间切换。这些模式呈现来自我的模型的数据 - 这是一个树结构,实现复合模式 - 通过重新排列层次结构中的叶对象,在树中相同“级别”的容器之间移动多个对象(想想一个包含袜子盒的抽屉,并在同一个抽屉的盒子之间随机移动多只袜子)。这通常需要对数据进行完全重新排列。目前我正在使用备忘录模式处理这个问题,序列化并保存当前模型,直到用户再次切换显示模式,当它恢复时。
同时,我还希望允许用户进行通常意义上的“编辑”序列——对对象进行任意、可重做的更改,改变它们的大小、颜色、形状等。所以它是标准的撤消重做模式。我还没有为此编写任何代码,但我想知道我应该如何针对我已经用于在显示模式之间切换的 Memento 方法来实现它。这是完全不同的东西,还是我可以/应该将两者结合起来?
可能暗示后者的一种情况是:用户可能会进行他们希望保存的编辑,同时处于将切换回先前存储的显示模式的显示模式,该模式现在将包含陈旧的数据。这建议一起管理显示模式更改和编辑序列,根据用户命令而不是应用程序状态来考虑它们(大概是根据命令模式对此进行建模)。大概在这种模式下,我将有一组用于显示模式的“配对”命令,而不是使用像 Memento 这样的序列化模式,它知道如何以适当的方式构造我的基础数据并在这些表示之间来回切换(虽然从表面上看,这似乎比我目前基于 Memento 的模式更复杂,因为我会 - 回到我的“抽屉”类比 - 必须立即跟踪每只袜子的盒子)。这是正确的方法吗?我对此的推理是否正确?
注意:我的模型非常小,通常不超过几 Kb,即使有用户交互,也不会增长太多。所以纪念品模式不会花费我任何东西。只是在它实施的地方继续使用它是否正确。
编辑
我想到的另一种可能性是通过视图模型方法处理显示模式。因此,不是每次都换出实际模型,就像我使用备忘录方法所做的那样,视图模型位于模型和视图之间,并以适合当前显示模式的方式“重构”模型数据。所以会有一个“默认”模式,它只是“按原样”呈现模型,但另一种模式是使用中间视图模型重构数据层次结构。在我看来,这种方法的主要缺点是它在应用程序架构中引入了另一个可变层,这可能被证明太脆弱而无法管理。基于备忘录的方法当然要简单得多。
java - 备忘录和命令设计模式有什么区别?
我已经成功地在 Java 上编写了一个纸牌游戏,现在我被要求在我的设计之上实现撤消/重做。
我的计划是存储用户执行的移动列表或堆栈,如果用户想要撤消,我会 1. 检查用户是否可以撤消(即列表或堆栈中有移动),然后 2. 反向我存储的最后两个动作(即我将卡片从其中移动的“从”移动和将卡片移动到的“到”移动)。
对于重做,我只会重做动作,具体取决于用户执行撤消操作的距离(例如,如果他们按下撤消两次,我至少会(列表大小 - 4)在我的列表或堆栈中)。
我认为它们将在这样的接口中实现:
我是在实现 Memento 还是 Command 设计模式,还是两者都没有?在这个游戏的撤消/重做的上下文中,我无法掌握这两种设计模式的样子。我也是 Java OOP 和一般设计模式的初学者。
java - java中的备忘录。可变状态
我正在尝试理解纪念品模式。为此,我正在尝试实现撤消功能。问题是,当我将发起者的旧状态保存在队列中并运行不同的函数时,保存状态会更改为当前状态。我真的需要帮助来了解我做错了什么。我怎样才能使向量不可变。
这是纪念品课。
Originator 只需要将一个布尔向量左移。(TRUE,FALSE,FALSE) 左移返回:(FALSE,FALSE,TRUE)。这就是实现。
还有看门人:
现在是测试类和我收到的错误。
控制台输出:
c# - Orc.Memento 具有多个控件的全局撤消
我需要实现一个纪念品撤消重做模式。我的应用程序有多个选项卡,在这些选项卡中有多个控件,它们都实现了 Orc.Memento。我遇到的麻烦是使用 MainWindow 上的菜单按钮调用撤消,并在最后一个活动控件上的按钮操作调用撤消。
编辑:不幸的是,这个项目不遵循 MVVM。
我选择 Orc.Memento 是因为它非常容易实现而无需修改对象。我现在只有使用键盘命令 Ctrl+X 和 Ctrl+Y 才能很好地工作。调用 undo 只会在活动控件上撤消。但是,当我单击 MainWindow 菜单上的撤消/重做按钮时,我的代码不知道调用撤消/重做的最后一个活动控件。
选项1
选项一是通过设置每个控件的全局属性来跟踪最后一个活动GotFocus()
控件。我觉得必须有更好的方法。
选项 2
这就是我在这里的原因:-)。
控制
主窗口
Ctrl+Z & Ctrl+Y 映射到这里。undo/redo 方法找到当前活动的控件并在该控件上调用 undo/redo。
注意:如果我可以通过自动导航到发生撤消/重做的控件来编程 Excel 的工作方式,那就太好了。这不是必需的,但如果你有一个想法,我的耳朵是敞开的。
jfreechart - 我可以为 JFreeChart 使用 Memento 设计模式吗?
是否可以在 JFreeChart 中使用备忘录模式进行撤消操作?
如果可能的话,请给我一些例子。
java - Memento not update state with undo in Java
I have a graph
that contains vertices
and edges
and I have an originator
class that contains the graph
that should be used to insert vertices
or get the list of vertices
in the graph
interface vertex
interface edge
interface graph
with Inserts a new vertex and other method is hide()
ADT Graph
implementation that stores a collection of vertices
(and edges, but not need)
class Memento
class Originator
Interface IMemento
class CareTaker
implements interface IMemento
my doubt starts after saving the state and when trying to do undo the graph
does not update to the previous state
but when I do restore de graph
still with 2 vertices
any suggestion?
c++ - Memento Pattern 和 MVC 模式,originator state 会一直重复吗?
我已经开始通过备忘录模式实现撤消和重做,到目前为止我的进展是:
来自类控制器,函数 RGB(...):
无效模型::setValue(...):
然后在我看来,on_undo_btn(...):
我的问题是:每次我按下“撤消”按钮时,当它更新滑块值时,我的 Memento 将在控制器被触发时重新录制,这样我就获得了 2 个相等的动量状态。现在,这还不错,因为我也想实现“重做”,所以我的想法是将这个“重复”推到我的实际状态之前,以便能够“从撤消中返回” ”。我怎样才能实现这样的条件?改变方法并在其他地方记录我的纪念品状态更好吗?