定义:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式包括以下4个对象:
- Command(抽象命令类): 抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute( )等方法,通过这些方法可以调用请求接收者的相关操作。
- ConcreteCommand(具体命令类): 具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。
- Invoker(调用者): 调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。
- Receiver(接收者): 接收者执行与请求相关的操作,它具体实现对请求的业务处理。
举例
用遥控器控制电视的打开、关闭、切换频道
- 抽象命令类
public interface AbstractCommand
{
void Execute();
}
- 具体命令类
//打开电视类
public class TvOpenCommand : AbstractCommand
{
//创建接收者对象
private TvReceiver tv;public TvOpenCommand()
{
tv = new TvReceiver();
}//收到请求调用接收者的方法
public void Execute()
{
tv.OpenTv();
}
}public class TvCloseCommand : AbstractCommand
{
private TvReceiver tv;public TvCloseCommand()
{
tv = new TvReceiver();
}public void Execute()
{
tv.CloseTv();
}
}public class TvChangeCommand : AbstractCommand
{
private TvReceiver tv;public TvChangeCommand()
{
tv = new TvReceiver();
}public void Execute()
{
tv.ChangeTv();
}
}
- 调用者
public class TvInvoker
{
//创建具体命令类对象
private AbstractCommand openCommand;
private AbstractCommand closeCommand;
private AbstractCommand changeCommand;public TvInvoker(AbstractCommand openCommand,
AbstractCommand closeCommand,
AbstractCommand changeCommand)
{
this.openCommand = openCommand;
this.closeCommand = closeCommand;
this.changeCommand = changeCommand;
}//通过不同的方法来调用具体命令类中的方法(发送请求)
public void Open()
{
openCommand.Execute();
}public void Close()
{
closeCommand.Execute();
}public void Change()
{
changeCommand.Execute();
}
}
- 接收者
public class TvReceiver
{
//具体实现业务处理
public void OpenTv()
{
Console.WriteLine("打开电视");
}public void CloseTv()
{
Console.WriteLine("关闭点视");
}public void ChangeTv()
{
Console.WriteLine("切换频道");
}
}
- 客户类
class Program
{
static void Main(string[] args)
{
AbstractCommand openCommand, closeCommand, changeCommand;openCommand = new TvOpenCommand();
closeCommand = new TvCloseCommand();
changeCommand = new TvChangeCommand();TvInvoker tvInvoker = new TvInvoker(openCommand, closeCommand, changeCommand);
//通过调用者发送请求
tvInvoker.Open();
tvInvoker.Close();
tvInvoker.Change();
}
}
总结:抽象命令类中,声明用于执行请求的方法,在具体命令类中,创建一个接收者对象,在执行请求的方法中调用接收者的执行方法,调用者类中创建所有具体命令类对象,根据不同的请求来调用不同具体命令类中的方法,接收者则负责实现所有具体操作。