再次理解——命令模式


命令模式是:將一個請求封裝爲對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作。


如何使用洗衣機:你使用洗衣機時,僅僅是去擰動按鈕,就可以開始洗衣服了。不需知道如何讓洗衣機去洗衣服,這就是典型的命令模式。即命令對象(洗衣服命令、脫水命令)並不知道如何處理命令,會有相應的接收者對象來執行命令(驅動器)。
本例子中:把洗衣服命令和脫水命令封裝爲對象;調用者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();//執行命令
            



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章