22_命令模式
命令模式是一种行为设计模式,它将请求封装成一个对象,从而使不同的请求可以参数化其他对象,或者在不同的时间进行调用和执行。在这种模式中,命令对象充当中介者,负责将请求者和执行者进行解耦。
命令模式包含以下几个角色:
-
命令接口(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!"); }