using System;
using System.Collections ;
namespace Pattern
{
public interface Command
{
void execute();
void undo();
}
//其中execute用來執行命令,undo用來恢復(undo).
//接下來實現這個接口,先來實現Cut命令:
public class CutCommand : Command
{
public void execute()
{
/* 備份舊數據 */
/* 剪切 */
}
public void undo()
{
/* 還原成備份的數據 */
}
}
//再來實現一個Delete命令:
public class DeleteCommand : Command
{
public void execute()
{
/* 備份舊數據 */
/* 刪除 */
}
public void undo()
{
/* 還原成備份的數據 */
}
}
//這樣的話我們每做一個編輯動作,就執行一個相應的command.接下來我們要考慮如何將這些執行過的命令保存下來,以實現undo/redo. 我們再設計一個CommandManager:
public interface CommandManager
{
void storeCommand(Command cmd);
void clearAllCommand();
void undo();
void redo();
}
//再來實現一個CommandManager, 我們稱作CommandHistoryManager:
public class CommandHistoryManager : CommandManager
{
ArrayList undoList=new ArrayList();
ArrayList redoList=new ArrayList();
public void storeCommand(Command cmd)
{
undoList.Add(cmd);
}
public void clearAllCommand()
{
undoList.Clear();
redoList.Clear();
}
public void undo()
{
if ( undoList.Count <= 0 ) return;
Command cmd = (Command)undoList[undoList.Count -1];
cmd.undo();
undoList.Remove (cmd);
redoList.Add(cmd);
}
public void redo()
{
if ( redoList.Count <= 0 ) return;
Command cmd = (Command)redoList[redoList.Count -1];
cmd.execute();
redoList.Remove(cmd);
undoList.Add(cmd);
}
}
}