嗚嗚喔學習筆記: Design pattern - Command Pattern - 命令模式

搜尋此網誌

2021年9月1日 星期三

Design pattern - Command Pattern - 命令模式

在物件導向程式設計的範疇中,命令模式 是一種設計模式,它嘗試以物件來代表實際行動。命令物件可以把行動(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);

}

}



沒有留言:

張貼留言