我有一个TextBox,我想为它实现撤消/重做功能.我已经读过它可能已经有一些轻微的撤消功能了,但它有错误吗?无论如何,我想实现撤消和重做功能,也只是为了了解如何继续这样做.
我已经阅读了有关Memento模式的内容,并在CodeProject 上查看了一些关于Generic Undo/Redo示例的内容.而模式kiiind是有道理的.我似乎无法围绕如何实现它.如何有效地做一个内容TextBox.
当然我可以存储的textbox.Text时间TextChanges,但这会非常快地拥抱相当多的内存,特别是如果TextBox包含大量的文本.
所以无论如何,我正在寻找一些关于如何实现良好,清晰和有效的实现此功能的方法的建议.一般而言,特别是对于TextBox c",)
该备忘录模式本身似乎相当直截了当.我正在考虑实现与维基百科示例相同的功能,但在此之前我是否有C#的任何语言功能,以便更容易实现或使用?
我正在对Memento模式进行一些研究,我通常是行为模式的新手,而且我的研究让我感到非常困惑.我一直困惑的主要问题之一是Memento Pattern和Serialization之间的差异.
从我可以收集的内容中,两者都可以用来存储物品,并在以后将它们带回来,但我无法找到关于它们之间的主要差异的明确答案,也许我在研究中遗漏了一些东西但我想知道是否有人可以透露两者之间的差异.
谢谢
我们知道memento模式没有违反封装,捕获和外化对象的内部状态,并且可以在不知道原始状态的情况下稍后进行回收.
我的问题在这里java.io.Serializable是如何进入这种模式的,因为当我们序列化任何私有变量并将对象状态同时写入文件时,私有变量的值对世界开放并且封装似乎在这里失败.
有哪些设计模式可以在对象变化时保留其历史记录.我不需要像事件源那样繁重的任务,只需要在特定事件发生时保存过去的版本(在这种情况下按下打印表单按钮时).
我是C#中状态模式实现的新手,你能否提供一些关于如何实现它的信息.
我正在使用状态模式在C#中重构状态机.目前我的状态机包含5个状态,只能通过状态前进或后退,即从状态1开始,你需要进入状态2,3和4,最后到达状态5.
我能够继续前进
mainclass.State = new NextSate();
Run Code Online (Sandbox Code Playgroud)
每次你想要前进时都会创建一个新状态,但是,一旦创建了所有状态和/或你想要后退,我需要进入相同的状态,而不仅仅是新状态.我怎样才能做到这一点?有没有更好的方法来做到这一点?
我目前正在试图弄清楚Memento Pattern的工作原理.我坚持Caretaker上课?拥有它真的很重要吗?我的意思是我可以在没有这门课的情况下使用纪念品.请参阅下面的代码.
public class Originator {
private String state;
private Integer code;
private Map<String, String> parameters;
// Getters, setters and toString were omitted
public Memento save() {
return new Memento(this);
}
public void restore(Memento memento) {
this.state = memento.getState();
this.code = memento.getCode();
this.parameters = memento.getParameters();
}
}
Run Code Online (Sandbox Code Playgroud)
这是Memento实施.
public class Memento {
private String state;
private Integer code;
private Map<String, String> parameters;
public Memento(Originator originator) {
Cloner cloner = new Cloner();
this.state = cloner.deepClone(originator.getState());
this.code = cloner.deepClone(originator.getCode());
this.parameters …Run Code Online (Sandbox Code Playgroud) 我正在寻找在CRUD表单中使用的memento模式(GoF)的JavaScript实现.在基本级别上,撤消对输入的更改就足够了,但将它与标准JS框架(如YUI或Ext)一起使用来撤消和重做网格操作(新行,删除行等)会很棒.
谢谢
Memento设计模式用于将对象还原到先前的状态,例如撤消。但是我们可以多次撤消和重做。我已经阅读了多次文章,但是我还是不清楚它们是否相似或相辅相成,可以一起使用。
State模式可以与Memento Design模式相关或一起使用吗?
我对纪念品应该如何实施感到非常困惑。
我知道Memento有一个State。而备忘录模式被用来存储不同的(以前)指出,这样一个可以在恢复对象以前的状态,
好吧,假设我有多个对象,每个对象都有 10 个属性,其中 5 个在每个对象的整个生命周期中保持不变,但其中 5 个会发生变化。所以我需要为每个对象保存它以前的状态并返回到它们。
问题:
如何将纪念品模式应用于这些对象?
到目前为止我的想法:
所以Memento Pattern有 3 个类,你创建了很多Memento,每个状态一个。Caretaker存储对象 AKA Mementos 的所有先前状态。然后发起人创建纪念品,也从一个得到美国纪念品。
这意味着每个对象实例都需要它自己的Caretaker 实例(它以前状态的列表),并且这个Caretaker将拥有具有该对象 5 个属性的先前状态(以及当前状态或仅先前状态?)的纪念品,但是所有具有看守者的对象都可以使用相同的Originator 实例,因为Originator可用于为任何看守者创建新的纪念品。
这是它的实施方式还是我误解了它?
它看起来像这样:
发起人和纪念品类
public class Memento …Run Code Online (Sandbox Code Playgroud) 我已经成功地在 Java 上编写了一个纸牌游戏,现在我被要求在我的设计之上实现一个撤消/重做。
我的计划是存储用户执行的移动列表或堆栈,如果用户想要撤消,我会 1. 检查用户是否可以撤消(即列表或堆栈中有移动),然后 2. 反向我存储的最后两个移动(即“从”移动我将卡片移出的位置和“到”移动,我将卡片移动到的位置)。
对于重做,我只会重做移动,这取决于用户执行撤消操作的距离(例如,如果他们按下撤消两次,我至少会在我的列表或堆栈下方(列表大小 - 4) )。
我认为它们将在这样的接口中实现:
public interface UndoRedo {
void undo();
void redo();
}
Run Code Online (Sandbox Code Playgroud)
我是在实现 Memento 或 Command 设计模式,还是两者都没有?在此游戏的撤消/重做上下文中,我无法理解这两种设计模式的外观。我也是 Java OOP 和一般设计模式的初学者。
感谢您阅读此问题.请帮我解决这个复杂的问题.
情况如下:
Oringator持有一个对象来执行某些方法.
Memento模式需要在oringator中备份复杂的对象状态.如何?
示例代码:
问题是,java确实通过值传递,不通过引用传递.但是对象传递有点棘手.如果我将一个对象传递给该方法,虽然该方法保存了一个新的记忆对象地址,但内存地址仍然指向传入的同一个对象.请参阅此示例:http: //www.javaworld.com/javaqa /2000-05/03-qa-0526-pass.html
如果我创建纪念品并将对象传递给新的纪念品对象,纪念品对象仍然保留了原始复杂对象(备份所需).
那么,如何创建memento模式来备份命令模式中的复杂对象?
谢谢.
java design-patterns pass-by-reference pass-by-value memento
我正在实现一个撤消/重做功能,它需要我使用备忘录模式。
部分程序的流程:“...程序然后使用Memento Pattern存储之前的Vector,然后将新创建的对象添加到Vector。之后,用户可以选择show命令来显示Vector内部的内容,他也可以输入undo命令来恢复,可以重复undo,直到恢复到原来的状态……”
从我的研究中,我知道会有一个发起者、纪念品和看守者。
这是我的看守计划
public class CareTaker {
private Memento m;
private Stack s;
private Vector v;
// Some of the implementation are not shown
public void create() {
// Some of the implementation are not shown
// Assuming Vector is named "v"
// Passing Vector to memento
m = new Memento(v);
s.add(m);
}
public void undo() {
v = s.pop().restore();
}
}
public class Memento {
private Vector _v;
public Memento(Vector v) {
_v = v;
}
public …Run Code Online (Sandbox Code Playgroud) memento ×13
design-patterns ×11
java ×6
c# ×3
oop ×2
undo-redo ×2
command ×1
fsm ×1
javascript ×1
serializable ×1
state ×1