今天咱们一块儿来看行为型设计模式中的命令模式、何为命令模式呢?先谈命令——我如今须要对某一条信息进行删除,我进行点击删除按钮。后台执行删除的命令、对信息进行删除。那么咱们要讲的命令模式又是什么呢?命令模式就是把一个操做或者行为抽象为一个对象。而后经过对命令的抽象化来使得发出命令的职责和执行命令的职责分隔开。简单来讲命令模式就是解决命令的请求者和命令的执行者之间的耦合关系的。html
在咱们开发软件系统的时候,命令的请求者和命令的执行者是属于紧耦合的状态。可是对于某些特殊场合这么一种紧耦合的状态就不合适了。例如对行为命令的”日志记录、撤销/恢复、命令的队列”等操做就不太合适了。那么在这些状况下如何对这些命令进行统一的管理呢?实现其松耦合呢?设计模式
将一个请求封装成一个对象,从而使您能够用不一样的请求对客户进行参数化。ide
咱们看上面的案例图能够看到命令模式是包含了如下五个部分的:this
客户角色:建立具体的命令对象并肯定命令对象的接收者spa
命令请求者:命令模式中最重要的角色、持有命令对象、实现对命令的控制、要求命令对象执行请求设计
命令接收者:真正的命令的执行者、实现具体功能日志
命令角色:声明全部的命令的一个抽象类code
具体命令角色:命令接口实现对象、持有命令接收者、调用接收者完成命令的执行htm
在咱们平常软件开发过程当中一定会涉及到信息的增删改查、通常的信息进行操做也就罢了。可是对于一些重要的信息进行操做的时候咱们是否就须要对其进行控制了。好比对其操做的日志的记录。对操做命令的撤销恢复。这里咱们看看如何使用命令模式来对命令进行控制操做:对象
namespace Command_Pattern { class CommandPattern { } #region 命令接收者——具体操做 ===================
/// <summary>
/// 执行命令 /// </summary>
public class InfoReceiver { public void Delete() { Console.WriteLine("删除了第一条信息!"); } public void Update() { Console.WriteLine("更新了次日信息!"); } } #endregion
#region 命令请求者——控制命令 ===================
/// <summary>
/// 控制命令调用请求 /// </summary>
public class InfoInvoke { /// <summary>
/// 记录上一个命令 /// </summary>
private Command lastCommand =null; /// <summary>
/// 接收当前命令 /// </summary>
private Command _command = null; public InfoInvoke(Command command=null) { this._command = command; } public string ExecuteInvoke() { if (_command==null&& lastCommand==null) return ("无命令执行!"); if (_command == null) { Console.WriteLine($"记录此操做记录{_command.GetType().Name}的撤销操做!"); _command = lastCommand; return ("执行撤销操做!"); } Console.WriteLine($"记录此操做记录{_command.GetType().Name}!"); _command.Execute(); return ("执行成功!"); } } #endregion
#region 命令角色——抽象命令 =====================
/// <summary>
/// 抽象命令 持有命令接收者,调用接收者执行命令 /// </summary>
public abstract class Command { protected InfoReceiver _infoReceiver; public Command(InfoReceiver infoReceiver) { this._infoReceiver = infoReceiver; } public abstract void Execute(); } #endregion
#region 具体命令角色——调用接收者 ===============
/// <summary>
/// 实现抽象角色 /// </summary>
public class InfoCommandDelete : Command { public InfoCommandDelete(InfoReceiver infoReceiver) : base(infoReceiver) { } public override void Execute() { _infoReceiver.Delete(); } } #endregion
#region 具体命令角色——调用接收者 ===============
/// <summary>
/// 实现抽象角色 /// </summary>
public class InfoCommandUpdate : Command { public InfoCommandUpdate(InfoReceiver infoReceiver) : base(infoReceiver) { } public override void Execute() { _infoReceiver.Update(); } } #endregion }
namespace Command_Pattern { class Program { static void Main(string[] args) { ///初始化命令接收者和命令请求者还有具体命令
InfoReceiver infoReceiver = new InfoReceiver(); InfoCommandDelete infoCommandDelete = new InfoCommandDelete(infoReceiver); InfoInvoke infoInvoke = new InfoInvoke(infoCommandDelete); var result=infoInvoke.ExecuteInvoke(); Console.WriteLine(result); } } }
在命令模式中重点就是实现将“行为请求者”和“行为实现者”之间进行解耦。而在命令请求者角色中能够对具体命令角色作必定的控制、同时也能够保存其额外的状态信息。
一、认为是命令的地方均可以使用命令模式
二、系统支持命令的撤销/恢复、从新执行等操做的时候能够考虑使用命令模式
三、命令的发送者和命令执行者有不一样的生命周期,不要求命令发送必须立马执行
四、命令须要进行管理控制时
一、下降了系统的耦合性
二、新的命令能够很容易添加到系统中
三、能够将命令组合在一块儿造成合成命令
四、能够设计实现撤销、从新执行的操做
一、使用命令模式可能致使有过多的具体命令类、这样会使系统变得不切实际。
到这里咱们就介绍完了命令模式。总的来讲命令模式是将”行为请求者”和”行为实现者”进行了解耦。解耦以后就方便对命令进行控制管理(操做信息日志记录、撤销/恢复操做、从新操做、命令队列等等)。同时对新的命令加入也方便了一些(方便对命令扩展)。
一我的如若不能使本身的人生辉煌,但也没有理由使它黯淡;人生能够平凡,但不能够庸俗、堕落;人生不在意掠取多少,而在于追求过程的完美与卓越!
欢迎你们扫描下方二维码,和我一块儿踏上设计模式的闯关之路吧!