命令模式將「請求」封裝為物件,使不同請求可參數化客戶端,支援排隊、日誌、撤銷/重做操作。核心在於分離「行為請求者」與「行為實現者」,透過抽象命令介面實現鬆耦合。
意圖:封裝請求為物件,支援參數化、排隊、日誌、可撤銷操作。(GoF)
結構圖:

服務員記錄點單於賬單 (命令物件),廚房依序製作。賬單不依賴菜單內容,可承載不同點單項目:

public class Document {
public void Display() => Console.WriteLine("Display");
public void Undo() => Console.WriteLine("Undo");
public void Redo() => Console.WriteLine("Redo");
}
// 用戶端直接呼叫 doc.Display(), doc.Undo()...
public abstract class DocumentCommand {
protected Document _doc;
public DocumentCommand(Document doc) { _doc = doc; }
public abstract void Execute();
}
public class DisplayCommand : DocumentCommand {
public DisplayCommand(Document doc) : base(doc) {}
public override void Execute() => _doc.Display();
}
public class UndoCommand : DocumentCommand { ... }
public class RedoCommand : DocumentCommand { ... }
public class DocumentInvoker {
private DocumentCommand _displayCmd, _undoCmd, _redoCmd;
public DocumentInvoker(DocumentCommand d, DocumentCommand u, DocumentCommand r) {
_displayCmd = d; _undoCmd = u; _redoCmd = r;
}
public void Display() => _displayCmd.Execute();
public void Undo() => _undoCmd.Execute();
public void Redo() => _redoCmd.Execute();
}
var doc = new Document();
var invoker = new DocumentInvoker(
new DisplayCommand(doc), new UndoCommand(doc), new RedoCommand(doc));
invoker.Display(); invoker.Undo(); invoker.Redo();
關鍵點:用戶端不再依賴 Document 具體方法,命令被提升為類別層級,雖違背純粹面向物件原則,但優雅解決請求者/執行者分離問題。
前端控制器模式分為 Handler (公共邏輯) 與 Command 樹 (業務命令):


// Handler 接收請求,委派 CommandFactory 選擇命令
public class Handler : IHttpHandler {
public void ProcessRequest(HttpContext context) {
Command cmd = CommandFactory.Make(context.Request.Params);
cmd.Execute(context);
}
}
// Command 介面
public interface Command { void Execute(HttpContext context); }
// Factory 依參數建立具體命令
public class CommandFactory {
public static Command Make(NameValueCollection parms) {
switch (parms["requestParm"]) {
case "1": return new FirstPortal();
case "2": return new SecondPortal();
default: return new FirstPortal();
}
}
}
// 抽象重導向命令
public abstract class RedirectCommand : Command {
protected abstract void OnExecute(HttpContext context);
public void Execute(HttpContext context) {
OnExecute(context);
context.Server.Transfer(...);
}
}
public class FirstPortal : RedirectCommand {
protected override void OnExecute(HttpContext context) => context.Items["portalId"] = "1";
}
public class SecondPortal : RedirectCommand {
protected override void OnExecute(HttpContext context) => context.Items["portalId"] = "2";
}
MacroCommand。命令模式簡單而優雅,將請求物件化,實現調用者與執行者解耦,支援豐富的行為擴充場景,是行為型模式中的經典之作。