命令模式是:将一个请求封装为对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
如何使用洗衣机:你使用洗衣机时,仅仅是去拧动按钮,就可以开始洗衣服了。不需知道如何让洗衣机去洗衣服,这就是典型的命令模式。即命令对象(洗衣服命令、脱水命令)并不知道如何处理命令,会有相应的接收者对象来执行命令(驱动器)。
本例子中:把洗衣服命令和脱水命令封装为对象;调用者Invoker的参数是不同的请求;调用者Invoker实施对请求的排队、记录、撤销等操作。而驱动器Driver才是真正执行操作的接收者,洗衣服命令和脱水命令调用驱动器的操作。
UML图:Driver是接收者,Command、WashCommand、DawaterCommand是命令对象,Invoker是调用者,相当于命令的集合。
相应代码:
//驱动器,真正执行命令的接收者
public class Driver
{
public void Wash()
{
Console.WriteLine("洗衣机开始洗衣服");
}
public void Dawater()
{
Console.WriteLine("洗衣机开始脱水");
}
}
public abstract class Command
{
protected Driver driver;
public Command(Driver driver)
{
this.driver = driver;
}
//以上确定参数,驱动器(Driver) 构造方法
abstract public void ExcuteCommand();
//抽象方法
}
//洗衣服命令,调用驱动器的操作
class WashCommand:Command
{
public WashCommand(Driver driver)
: base(driver)
{ }
//参数和父类一样,子类的构造方法需要调用和父类一样的构造方法,用base关键字
public override void ExcuteCommand()
{
driver.Wash();
}
}
//脱水命令,调用驱动器的操作
class DawaterCommand : Command
{
public DawaterCommand(Driver driver)
: base(driver)
{ }
public override void ExcuteCommand()
{
driver.Dawater();
}
}
public class Invoker
{
private Command command;
public void SetCommand(Command command)
{
this.command = command;
}
//构造方法,确定参数为Command;设置命令
public void ExecuteCommand()
{
command.ExcuteCommand();
}
//调用Command的操作
}
//客户端
static void Main(string[] args)
{
Driver 驱动器 = new Driver(); //实例化,真正执行操作的驱动器
Command 洗衣服 = new WashCommand(驱动器); //实例化,具体的命令
Invoker 调用者 = new Invoker(); //实例化,调用者
调用者.SetCommand(洗衣服); //设置命令
调用者.ExecuteCommand();//执行命令