问题标签 [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 回答
199 浏览

design-patterns - 我需要一个设计模式来为我的程序提供撤消功能

我需要一个设计模式来为我的程序提供撤消功能。我已经使用过 Memento,但我的课程作业需要另一个。

0 投票
2 回答
895 浏览

c# - WPF:在可编辑的组合框中禁用撤消

我已经实现了一个基于 Memento 模式的撤销系统。我禁用了 TextBox 上的内置撤消功能,并且想知道如何在 ComboBox 上执行此操作。我拥有的组合框是可编辑的,因此它包含一个文本框,我如何访问它以禁用它的撤消。

我知道我可以从 ComboBox 派生添加一个属性并覆盖控件模板并在 TextBox 上设置该属性,但我希望有一种方法可以在 xaml 的标准 ComboBox 上执行此操作。

0 投票
3 回答
1504 浏览

java - java.io.Serializable 是如何实现 Memento 模式的?

正如我们所知,备忘录模式在不违反封装、捕获和外部化对象的内部状态的情况下,可以在不知道原始状态的情况下稍后回收。

我的问题在这里java.io.Serializable出现,因为当我们序列化任何私有变量并同时将对象状态写入文件时,私有变量的值对世界开放并且封装似乎在这里失败。

0 投票
2 回答
659 浏览

java - 实现可撤消的命令 - Java

我目前正在编写一个小文本编辑器(学校项目),我在寻找一种管理可撤销命令的好方法时遇到了一些麻烦。

(这不是一个代码审查问题,因为它不仅仅是关于改进。如果我希望我的应用程序按我想要的方式工作,我需要更改我的代码)

以下是我的应用程序的工作方式:我有一个具体的主题,它保存实际上是一个字符数组列表的缓冲区。每当修改此数组列表(插入、剪切、粘贴...)时,主题都会更新观察者——目前仅包含一个 gui——(MVC 模式)。

到目前为止,我为撤消和重做所做的是保存缓冲区的整个状态(通过纪念品),这工作正常但是:

  • 显然可以改进。
  • 不适用于我需要实现的新功能(记录用户操作,以便他可以随时播放)

我不知道如何保存命令而不是缓冲区,以及它是否是好方法。

这是程序的一些块(用于插入命令):

“图形用户界面”.java

命令管理器.java

命令插入.java

TextConcrete.java

CommandUndoable 只是保存缓冲区状态的备忘录,然后保存在 CareTaker (CommandManager) 中的备忘录列表中。

任何帮助将不胜感激。

0 投票
3 回答
6137 浏览

c# - 具有先前状态的状态模式 C#

我是 C# 中状态模式实现的新手,您能否提供一些有关如何实现它的信息。

我正在使用状态模式在 C# 中重构状态机。目前我的状态机包含 5 个状态,只能通过状态前进或后退,即从状态 1 到状态 2、3 和 4 最终到达状态 5。在此处输入图像描述

我能够继续前进

每次您想前进时都会创建一个新状态,但是,一旦所有这些都已创建和/或您想后退,我将需要进入相同的状态,而不仅仅是一个新状态。我怎样才能做到这一点?有没有更好的方法让它变得简单?

0 投票
4 回答
14849 浏览

c# - C#4 中的备忘录模式是如何实现的?

Memento Pattern本身看起来很简单。我正在考虑实现与维基百科示例相同的方法,但在我这样做之前,是否有 C# 的任何语言特性使其更易于实现或使用?

0 投票
3 回答
1744 浏览

eclipse-plugin - Eclipse 在视图关闭时调用 ViewPart saveState

我有一个使用扩展视图的 Eclipse 插件ViewPartViewPart有一个saveState需要IMemento.

我将我的代码添加到saveState相应的init方法中,它可以工作。不幸的是,saveState仅在整个工作区关闭时才调用。我的观点并不是那么重要,以至于我可以期望它一直被打开。saveState因此,如果在视图关闭时调用它会很酷。

我发现一个视图部分侦听器意味着对视图关闭做出反应,但我没有得到的是IMemento来自哪里。我在哪里可以获得用于工作区关闭的纪念品对象?init或者如果视图被(重新)打开,我必须在哪里存储我自己的纪念品对象以使视图部分在方法中使用它?

这是我的saveState- 我可以告诉我的视图以某种方式告诉每次视图关闭时调用它吗?

0 投票
2 回答
971 浏览

javascript - Jquery Forms:使用备忘录模式构建脏表单通知系统 - 现有模式?

我目前正在构建一个脚本,它将在用户离开页面之前通知用户表单已更改(顺便说一句,这是一个 ASP.NET MVC 应用程序)。

我首先开始构建一个简单的脚本,该脚本检测用户是否更改了任何输入,然后稍微翻转以将表单指定为“脏”。

这最终太简单了,并且缺乏对扩展表单输入的支持,所以我接下来尝试了一个插件。

我能找到的最好的是:http: //mal.co.nz/code/jquery-dirty-forms/

这个 jquery 脏表单插件工作得很好,但仍然缺少我需要的一个重要功能;将以前的值与用户输入的值进行比较的能力。

例如,如果一个文本字段最初的值为“Foo Bar”,而用户将该值更改为“Foo”,则该表单现在是脏的。

当用户将该文本框的值更改回“Foo Bar”时,然后使用此插件,表单仍然是“脏”的,这根据我的要求是不正确的。

没有插件可以满足我的需要,所以我必须自己构建,这引出了我的问题:构建这种功能的最佳实践是什么?

我的想法是这样的:

  • 由于这个应用程序是 MVC,我可以使用以下技术:
    • jQuery
    • json
    • 数据注释

我最初的想法是:

  • 页面可以有多种形式;每个表单都有一个属性“isDirty”,最初设置为 false。
  • 我需要存储每个字段的原始值以进行比较(纪念品)
  • 每个字段都可以有一个类/标志/属性“isDirty”,它将调用该字段“突出显示等”
  • 我可以将这些字段值存储在 JSON NVP 数据结构中
  • 在提交时,JavaScript 将遍历该 JSON 字符串并查看原始值,与当前值进行比较,如果它无效,那么它将在违反脏规则的文本字段中添加“脏”标志(附加类名) .

性能和可重用性是明确的考虑因素。我应该能够将此模式应用于任何形式,并且只需很少的工作就可以让它使用原始值并执行验证。

有没有人看到与我的需求相似的现有模式?我的想法听起来可行吗?有人对我可以采取的更好路线提出意见吗?让我开始使用我可以扩展的代码示例会很棒,伪代码也很好。

[更新]

有人刚刚告诉我我正在尝试做的事情通常被称为“表单存储”,尽管谷歌对这个搜索词没有多大帮助。

我一直在使用的这个脚本与我想做的类似:(从此页面:http ://www.mydogboris.com/2009/10/using-jquery-data-feature-to-detect-form-变化/ )

0 投票
2 回答
892 浏览

java - 代理和备忘录模式

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

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

  • 当我可以访问Serviceand时,我想不出一个例子ProxyService,但不是RealService- 有人可以提供关于何时发生这种情况的例子吗?

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

0 投票
3 回答
1574 浏览

c# - 多个变量的撤消/重做实现

我正在尝试重构我拥有的撤消/重做实现,但不确定如何去做。

显然,每个 UndoRedoAction 子类在访问不同字段时都具有自定义功能,但它们在这些字段上执行的功能是相同的。是否有任何干净的方法,除了将这些整数转换为属性并传递属性名称(我宁愿不这样做,魔术字符串等),将它们组合成一个通用的 UndoRedoAction 而不是制作一堆所有执行的子类对不同变量执行完全相同的操作?

我确实考虑过使用 Memento 模式来解决这个问题,但是对于这么小的场景来说,这似乎有点矫枉过正,而且我没有需要担心的单向操作,这正是 Memento 模式真正有用的地方。

谢谢。

澄清:这些 UndoRedoAction 对象被放置在一个 Stack<UndoRedoAction> 中,该 Stack<UndoRedoAction> 用作撤消缓存。更具体地说,有两个堆栈,一个用于撤消,一个用于重做,从一个弹出的操作被推送到另一个。此外,针对 Zaid Masud 的回应,变量不一定都是整数,甚至不一定都是相同的对象类型。我的例子只是为了简单起见。