Command
命令模式:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作
别名:动作模式、事务模式
命令模式主要的目的就是将命令的发送者与接收者进行解耦,发送者只负责发送命令即可,对于具体怎么执行,发送者无需关心,全由接受者决定。这样使得调用更加的灵活。而且当一个命令由多个发送者(可以理解为多个快捷键)触发的时候,那么命令模式在一定的程度上还可以提高代码的复用程度。
命令模式涉及到五个角色,他们分别是:
- 客户端角色(Client):创建一个具体命令ConcreteCommand对象并确定其接收者。
- 抽象命令角色(ICommand): 声明一个给所有具体命令类的抽象接口。
- 具体命令角色(ConcreteCommand):定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
- 调用者/发送者/请求者角色(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法。通常会将命令聚合在类中。
- 实现者/接收者角色(Receiver):负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
1、场景描述
2、实现
/// <summary>/// 命令接收者-电视机/// </summary>public class Television{public void Start(){Console.WriteLine("电视开机");}public void Close(){Console.WriteLine("电视关机");}}/// <summary>/// 抽象命令类/// </summary>public interface ICommand{/// <summary>/// 命令执行/// </summary>public void Excute();}/// <summary>/// 具体命令-电视开机命令/// </summary>public class StartCommand : ICommand{private readonly Television _tv;public StartCommand(Television tv){this._tv = tv;}/// <summary>/// 开机/// </summary>public void Excute(){_tv.Start();}}/// <summary>/// 具体命令-电视关机命令/// </summary>public class CloseCommand : ICommand{private readonly Television _tv;public CloseCommand(Television tv){this._tv = tv;}/// <summary>/// 关机/// </summary>public void Excute(){_tv.Close();}}/// <summary>/// 命令发送者--电视遥控器/// </summary>public class RemoteControl{private readonly ICommand _command;public RemoteControl(ICommand command){this._command = command;}/// <summary>/// 发送命令/// </summary>public void Action(){_command.Excute();}}// 客户端调用Television tv = new Television();ICommand startCommand = new StartCommand(tv);RemoteControl control = new RemoteControl(startCommand);control.Action();Console.WriteLine("*************************");ICommand closeCommand = new CloseCommand(tv);RemoteControl control1 = new RemoteControl(closeCommand);control1.Action();
3、优缺点
优点:
- 降低系统各模块之间的耦合度,这也是命令模式的目的
- 满足开闭原则,动态增加、删除命令,对原有功能不产生影响
- 可以实现执行撤销操作,上面的例子没有撤销,其实很简单,就是在撤销方法里面执行想发的方法即可
- 可以在执行命令的同时增加额外的功能。比如上面例子中,在StartCommand执行 _tv.Start()之前,还可以增加日志记录等操作。
缺点:
