命令模式是:將一個請求封裝爲對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作。
如何使用洗衣機:你使用洗衣機時,僅僅是去擰動按鈕,就可以開始洗衣服了。不需知道如何讓洗衣機去洗衣服,這就是典型的命令模式。即命令對象(洗衣服命令、脫水命令)並不知道如何處理命令,會有相應的接收者對象來執行命令(驅動器)。
本例子中:把洗衣服命令和脫水命令封裝爲對象;調用者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();//執行命令