在物件導向程式設計的範疇中,命令模式 是一種設計模式,它嘗試以物件來代表實際行動。命令物件可以把行動(action) 及其參數封裝起來,於是這些行動可以被:- 重複多次
- 取消(如果該物件有實作的話)
- 取消後又再重做
這裡實現一個可以做 上一步 & 下一步 的命令模式
如果要新增指令 只要繼承 ICommand 並實作 Execute() && Undo() 就行了
使用時只要呼叫
_cmd = new XXXCmd();
_cmd.Execute();
_cmdHistoryMgr.StoreCommand(_cmd);
上一步只需要呼叫 _cmdHistoryMgr.Undo();
下一步則是呼叫 _cmdHistoryMgr.Redo();
不需要管Command的細節 達到擴充性。
using System.Collections.Generic;
public interface ICommand
{
void Execute();
void Undo();
}
public interface ICommandManager
{
void StoreCommand(ICommand cmd);
void ClearAllCommand();
void Undo();
void Redo();
}
public class CommandHistoryManager : ICommandManager
{
Stack<ICommand> _undoStack = new Stack<ICommand>();
Stack<ICommand> _redoStack = new Stack<ICommand>();
public void ClearAllCommand()
{
_undoStack.Clear();
_redoStack.Clear();
}
public void StoreCommand(ICommand cmd)
{
_undoStack.Push(cmd);
}
public void Redo()
{
if (_redoStack.Count <= 0)
{
return;
}
ICommand cmd = _redoStack.Pop();
cmd.Execute();
_undoStack.Push(cmd);
}
public void Undo()
{
if(_undoStack.Count <= 0)
{
return;
}
ICommand cmd =_undoStack.Pop();
cmd.Undo();
_redoStack.Push(cmd);
}
}