我正在尝试重构我拥有的撤消/重做实现,但不确定如何去做。
public class MyObject
{
public int A;
public int B;
public int C;
}
public abstract class UndoRedoAction
{
protected MyObject myobj;
protected int oldValue;
protected int newValue;
public abstract void Undo();
public abstract void Redo();
}
public class UndoRedoActionA : UndoRedoAction
{
UndoRedoActionA(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.A;
newValue = new;
myobj.A = newValue;
}
public override void Undo()
{
myobj.A = oldValue;
}
public override void Redo()
{
myobj.A = newValue;
}
}
public class UndoRedoActionB : UndoRedoAction
{
UndoRedoActionB(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.B;
newValue = new;
myobj.B = newValue;
}
public override void Undo()
{
myobj.B = oldValue;
}
public override void Redo()
{
myobj.B = newValue;
}
}
public class UndoRedoActionC : UndoRedoAction
{
UndoRedoActionC(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.C;
newValue = new;
myobj.C = newValue;
}
public override void Undo()
{
myobj.C = oldValue;
}
public override void Redo()
{
myobj.C = newValue;
}
}
显然,每个 UndoRedoAction 子类在访问不同字段时都具有自定义功能,但它们在这些字段上执行的功能是相同的。是否有任何干净的方法,除了将这些整数转换为属性并传递属性名称(我宁愿不这样做,魔术字符串等),将它们组合成一个通用的 UndoRedoAction 而不是制作一堆所有执行的子类对不同变量执行完全相同的操作?
我确实考虑过使用 Memento 模式来解决这个问题,但是对于这么小的场景来说,这似乎有点矫枉过正,而且我没有需要担心的单向操作,这正是 Memento 模式真正有用的地方。
谢谢。
澄清:这些 UndoRedoAction 对象被放置在一个 Stack<UndoRedoAction> 中,该 Stack<UndoRedoAction> 用作撤消缓存。更具体地说,有两个堆栈,一个用于撤消,一个用于重做,从一个弹出的操作被推送到另一个。此外,针对 Zaid Masud 的回应,变量不一定都是整数,甚至不一定都是相同的对象类型。我的例子只是为了简单起见。