這章我們來看下命令模式,從乙個例子開始,我們想做乙個遙控器,這個遙控器可以控制燈、電視、風扇、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 我對...