Head First 命令模式

2021-07-23 02:11:58 字數 3107 閱讀 8234

這章我們來看下命令模式,從乙個例子開始,我們想做乙個遙控器,這個遙控器可以控制燈、電視、風扇、cd機等等,並且還有乙個撤銷鍵。這裡我們就可以利用命令模式來很好的完成這個遙控器。

1.首先客戶負責建立命令物件。命令物件一般有乙個execute函式,代表這個命令要完成的事情

2.客戶把命令放在乙個控制器中。類似呼叫控制器的setcommand函式

3.最後控制器會在某個時間點呼叫剛才那個命令的execute函式,來執行命令。

而這裡為了達到解耦的目的,一般在execute會用另乙個物件來完成事情。

命令模式:將請求封裝成物件,以便使用不同的請求。

命令模式也支援可撤銷的操作。

下面就是乙個簡單的實現,我們來看**,每個command,必須實現乙個execute函式,而且要把實現內容解耦,就要有乙個實現類這裡就是light。在遙控器中buttonwaspressed就是條件滿足的時候。

public inte***ce command 

//命令

public class lightoncommand implements command

public void execute()

}//遙控器

public class ******remotecontrol

public void setcommand(command command)

public void buttonwaspressed()

}//測試類

public class remotecontroltest

}

下面我們再進一步看下遙控器,這裡nocommand也是乙個類,這個類的execute函式是乙個空實現。

public class remotecontrol 

}public setcommand(int slot, command oncommand, command offcommand)

public void onbuttonwaspressed(int slot)

public void offbuttonwaspressed(int slot)

}

這裡我們再來看下lightoffcommand類

//關燈命令

public class lightoffcommand implements command

public void execute()

}

測試類

public class remoteloader 

}

下面我們要對撤銷鍵的實現,我們需要在command的介面中增加undo函式

public inte***ce command

下面是開燈和關燈命令的undo函式

//開燈命令

public class lightoncommand implements command

public void execute()

public void undo()

}//關燈命令

public class lightoffcommand implements command

public void execute()

public void undo()

}

像風扇這種有速度的又如何實現撤銷鍵呢?

public class celingfanhighcommand implements command 

public void execute()

public void undo() else if (prevspeed == celingfan.low) else if (prevspeed == celingfan.off)

}}

再來看看遙控器增加撤銷鍵的**:

public class remotecontrol 

undocommand = nocommand;

}public setcommand(int slot, command oncommand, command offcommand)

public void onbuttonwaspressed(int slot)

public void offbuttonwaspressed(int slot)

public void undobuttonwaspressed()

}

多個命令組合,下面就是組合命令

public class macrocommand implements command 

public void execute()

}}

那麼如何使用呢?

light light = new light("living room");

tv tv = new tv("living room");

lightoncommand lighton = new lightoncommand(light);

tvoncommand tvon = new tvoncommand(tv);

...//省略off的命令

command partyon = ;

command partyoff = ;

macrocommand partyonmacrot = new macrocommand(partyon);//組合開燈和開電視命令

macrocommand partyoffmarco = new macrocommand(partyoff);//組合關燈和關電視命令

remotecontrol.setcommand(0, partyonmacrot, partyoffmarco);//設定命令的按鍵

remotecontrol.onbuttonwaspressed(0);//組合鍵開

remotecontrol.offbuttonwaspressed(0);//組合鍵關

命令模式 Head First版

用命令模式實現這樣乙個需求 有個按鈕,將一盞電燈的開和關動作都繫結在這個按鈕上。另外還有乙個undo按鈕,可撤消之前的乙個動作。下面這個電燈類,對應上面的圖也就是接收者 package com.headfirst.chapter6 public class light public void off...

Head First設計模式1 命令模式

命令模式 通過命令模式,可以使發出請求的物件與被請求的物件都依賴抽象程式設計,而非依賴具體的類,實現了解耦。並且由於較好的封裝了請求,命令模式可以被撤銷。package command inte ce icommand class light public void on public void o...

《Head First設計模式》之命令模式

命令模式就是將方法呼叫 method invocation 封裝起來。通過封裝方法呼叫,我們可以把運算塊包裝成形,所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以了。通過封裝方法呼叫,可以用在以下場景 記錄日誌或者重複使用這些封裝來實現撤銷 undo 我對...