命令模式是一種行為設計模式,它將請求封裝成一個物件,從而使不同的請求可以引數化其他物件,或者在不同的時間進行呼叫和執行。在這種模式中,命令物件充當中介者,負責將請求者和執行者進行解耦。
命令模式包含以下幾個角色:
-
命令介面(Command Interface):定義了命令物件的執行方法。
-
具體命令(Concrete Command):實現了命令介面,包含了具體的執行邏輯。
-
請求者(Invoker):負責呼叫命令物件執行請求。
-
執行者(Receiver):負責執行具體的命令邏輯。
命令模式的工作流程如下:
-
建立具體命令物件,並指定其關聯的執行者。
-
將具體命令物件傳遞給請求者。
-
請求者呼叫具體命令物件的執行方法。
-
具體命令物件將請求傳遞給執行者,並執行相應的邏輯。
命令模式的優點包括:
-
解耦請求者和執行者,使得系統更加靈活和可擴充套件。
-
可以方便地實現撤銷、重做等操作。
-
可以實現命令的排隊、記錄和回放等功能。
命令模式適用於以下情況:
-
需要將請求封裝成物件,並且需要在不同的時間進行呼叫和執行。
-
需要支援撤銷、重做等操作。
-
需要將請求的傳送者和執行者解耦,使得系統更加靈活。
總之,命令模式是一種將請求封裝成物件的設計模式,它能夠實現請求和執行者之間的解耦,並提供了一些額外的功能,如撤銷、重做等。
IReceiver
/// <summary> /// 執行者 /// </summary> public interface IReceiver { /// <summary> /// 上任 /// </summary> void Start(); /// <summary> /// 回城 /// </summary> void Return(); }
Command Interface
/// <summary> /// 命令抽象類 /// </summary> public abstract class CommandBase { protected IReceiver receiver; public CommandBase(IReceiver receiver) { this.receiver = receiver; } /// <summary> /// 執行 /// </summary> public abstract void Execute(); }
Receiver
/// <summary> /// 將軍 /// </summary> public class General : IReceiver { public void Return() { Console.WriteLine("回京覆命......."); } public void Start() { Console.WriteLine("他鄉赴任官職....."); } }
Concrete Command
/// <summary> /// 第一道詔書,任職詔書 /// </summary> public class OfferCommand : CommandBase { public OfferCommand(IReceiver receiver) : base(receiver) { } public override void Execute() { receiver.Start(); } }
/// <summary> /// 第二道詔書,回城詔書 /// </summary> public class ReturnCommand : CommandBase { public ReturnCommand(IReceiver receiver) : base(receiver) { } public override void Execute() { receiver.Return(); } }
Invoker
/// <summary> /// 請求者-宦官 /// </summary> public class Invoker { private CommandBase command; public void SetCommand(CommandBase command) { this.command = command; } /// <summary> /// 宣讀生旨 /// </summary> public void Reading() { command.Execute(); } }
Client
/// <summary> /// 皇帝 /// </summary> public class Client { public void Start() { IReceiver receiver = new General();//執行者 Invoker invoker = new Invoker();//請求者 //赴任聖旨 CommandBase command1 = new OfferCommand(receiver); invoker.SetCommand(command1); invoker.Reading(); Console.WriteLine("N年後..........."); //回城覆命聖旨 CommandBase command2 = new ReturnCommand(receiver); invoker.SetCommand(command2); invoker.Reading(); } }
呼叫
static void Main(string[] args) { new Client().Start(); Console.ReadKey(); Console.WriteLine("Hello, World!"); }