C#中Undo/Redo的一个简易实现
时间: 2024-02-03 15:15:30 浏览: 27
在C#中实现Undo/Redo可以使用Command模式。下面是一个简易的实现:
1. 定义一个抽象命令类`Command`,其中包含两个方法`Execute()`和`UnExecute()`,分别表示执行和撤销操作。
```C#
public abstract class Command
{
public abstract void Execute();
public abstract void UnExecute();
}
```
2. 创建具体的命令类,例如`AddCommand`、`DeleteCommand`等,实现`Execute()`和`UnExecute()`方法。
```C#
public class AddCommand : Command
{
private string _text;
private List<string> _list;
public AddCommand(string text, List<string> list)
{
_text = text;
_list = list;
}
public override void Execute()
{
_list.Add(_text);
}
public override void UnExecute()
{
_list.Remove(_text);
}
}
```
3. 创建一个`CommandManager`类,用于管理命令的执行和撤销。
```C#
public class CommandManager
{
private List<Command> _commandList = new List<Command>();
private int _currentIndex = -1;
public void ExecuteCommand(Command command)
{
command.Execute();
if (_commandList.Count > _currentIndex + 1)
{
_commandList.RemoveRange(_currentIndex + 1, _commandList.Count - _currentIndex - 1);
}
_commandList.Add(command);
_currentIndex++;
}
public void Undo()
{
if (_currentIndex >= 0)
{
_commandList[_currentIndex].UnExecute();
_currentIndex--;
}
}
public void Redo()
{
if (_currentIndex < _commandList.Count - 1)
{
_currentIndex++;
_commandList[_currentIndex].Execute();
}
}
}
```
4. 在需要实现Undo/Redo的地方,创建`CommandManager`对象,执行相应的命令。
```C#
var list = new List<string>();
var manager = new CommandManager();
manager.ExecuteCommand(new AddCommand("hello", list));
manager.ExecuteCommand(new AddCommand("world", list));
manager.Undo();
manager.Redo();
```
上述代码中,首先创建了一个空的字符串列表`list`,然后创建了一个`CommandManager`对象`manager`。接着使用`AddCommand`命令向列表中添加了两个字符串。最后执行了一次Undo和一次Redo操作,最终列表中只包含了一个字符串"hello"。