只需做一点研究,我就会找到一些可能的解决方案。最简单的可能是使用堆栈。另一种是使用纪念品模式。但是,既然您在这里询问了命令模式,那么您就是一个简单的示例。
这基本上取自 codeprojects 示例。
class Document
{
private List<string> _textArray = new List<string>();
public void Write(string text)
{
_textArray.Add(text);
}
public void Erase(string text)
{
_textArray.Remove(text);
}
public void Erase(int textLevel)
{
_textArray.RemoveAt(textLevel);
}
public string ReadDocument()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(string text in _textArray)
sb.Append(text);
return sb.ToString();
}
}
abstract class Command
{
abstract public void Redo();
abstract public void Undo();
}
class DocumentEditCommand : Command
{
private Document _editableDoc;
private string _text;
public DocumentEditCommand(Document doc, string text)
{
_editableDoc = doc;
_text = text;
_editableDoc.Write(_text);
}
override public void Redo()
{
_editableDoc.Write(_text);
}
override public void Undo()
{
_editableDoc.Erase(_text);
}
}
class DocumentInvoker
{
private List<Command> _commands = new List<Command>();
private Document _doc = new Document();
public void Redo( int level )
{
Console.WriteLine( "---- Redo {0} level ", level );
((Command)_commands[ level ]).Redo();
}
public void Undo( int level )
{
Console.WriteLine( "---- Undo {0} level ", level );
((Command)_commands[ level ]).Undo();
}
public void Write(string text)
{
DocumentEditCommand cmd = new
DocumentEditCommand(_doc,text);
_commands.Add(cmd);
}
public string Read()
{
return _doc.ReadDocument();
}
}
使用命令模式。
我们对 documentinvoker 的实例执行两个“操作”(实现我们的命令模式)。
DocumentInvoker instance = new DocumentInvoker ();
instance.Write("This is the original text.");
instance.Write(" Here is some other text.");
现在我们可以撤消这些操作。
instance.Undo(1);
文档中的文本现在将是。
---- Undo 1 level
This is the original text.
现在我们可以重做这个动作
instance.Redo(1);
文本将。
---- Redo 1 level
This is the original text. Here is some other text.
显然,您需要对其进行修改以满足您的需求。如果您想要更多解释,请查看文章http://www.codeproject.com/KB/books/DesignPatterns.aspx。