展示命令模式支援的操作執行、撤銷與重做功能:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Pattern.Command;
public partial class Command : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Message m = new Message();
Response.Write("操作");
Response.Write("<br />");
Response.Write(m.Do(Action.Insert, new MessageModel("第1條", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Do(Action.Insert, new MessageModel("第2條", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Do(Action.Insert, new MessageModel("第3條", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Do(Action.Insert, new MessageModel("第4條", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Do(Action.Delete, new MessageModel("第2條", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Do(Action.Insert, new MessageModel("第5條", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Do(Action.Delete, new MessageModel("第3條", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Do(Action.Insert, new MessageModel("第6條", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Do(Action.Insert, new MessageModel("第7條", DateTime.Now)));
Response.Write("<br />");
Response.Write("<br />");
Response.Write("撤銷4次操作");
Response.Write("<br />");
Response.Write(m.Undo(4));
Response.Write("<br />");
Response.Write("<br />");
Response.Write("重復2次操作");
Response.Write("<br />");
Response.Write(m.Redo(2));
Response.Write("<br />");
Response.Write("<br />");
Response.Write("撤銷3次操作");
Response.Write("<br />");
Response.Write(m.Undo(3));
}
}
操作
Insert:第1條
Insert:第2條
Insert:第3條
Insert:第4條
Delete:第2條
Insert:第5條
Delete:第3條
Insert:第6條
Insert:第7條
撤銷4次操作
Delete:第7條 Delete:第6條 Insert:第3條 Delete:第5條
重復2次操作
Insert:第5條 Delete:第3條
撤銷3次操作
Insert:第3條 Delete:第5條 Insert:第2條
Message (Invoker) 維護命令清單 _listCommand 與當前指標 current。Undo(4) 向後移動指標 4 步,執行各命令的 UnExecute()(反向操作:Insert↔Delete)。Redo(2) 向前移動指標 2 步,再次執行 UnExecute()(此處邏輯為重做反向操作)。Undo(3) 繼續向後撤銷,展示命令歷史的雙向導航能力。| 優勢 | 說明 |
|---|---|
| 請求物件化 | 將操作封裝為命令物件,可傳遞、儲存、佇列、日誌記錄。 |
| 撤銷/重做 | 透過命令歷史與反向操作實現,支援多級撤銷重做。 |
| 解耦合 | 請求者與接收者分離,Invoker 不知 Receiver 具體類別。 |
| 可擴展性 | 新增命令類型只需新增 ConcreteCommand,不修改 Invoker/Receiver。 |
| 巨集命令 | 可組合多個命令為巨集命令(Composite Command)。 |