HeadFirst设计模式-命令模式
定義
命令模式——將請求封裝成對象,這可以讓你使用不同的請求、隊列,或者日志請求來參數化其他對象。命令模式也可以支持撤銷操作。
實例
餐廳點餐
以餐廳為例,顧客點餐,服務員記錄訂單,后移交給后廚制作。服務員是不用具體知道菜品是如何制作的,只需要記錄下菜名,移交給后廚。服務員實際上將顧客和后廚解耦了,他們之間通過一個個菜品名,即一個個命令產生聯系。不同的菜品可以互相組合,同樣命令也可以互相組合。
下面列出餐廳對象與命令模式對象的對應關系:
| 顧客 | Client |
| 訂單 | Command |
| 廚師 | Receiver |
| 服務員 | Invoker |
| 移交訂單 | setCommand() |
| 制作菜品 | execute() |
實現命令接口
首先,讓所有的命令對象實現相同的包含一個方法的接口。在餐廳例子中,這個方法為制作菜品orderUp(),然而,現在改為一般慣用的名稱execute()。這就是命令接口:
public interface Command {public void execute(); }實現一個制作魚湯的命令
現在,菜單中有魚湯這個菜品,廚師制作魚湯,來看下如何實現成一個命令:
public class FishSoupCommand implements Command {FishSoup fishSoup;public FishSoupCommand(FishSoup fishSoup) {this.fishSoup = fishSoup;}public void execute() {// 制作魚湯FishSoup.cooking();} }使用命令對象
把一切簡化,看下這個訂單如何完成:
public class SimpleOrder {Command cmd;public SimpleOrder() {}public void setCommand(Command command) {cmd = command;}// 點餐public void orderUp() {cmd.execute();} }簡單測試
下面來看顧客點了一個魚湯后的測試代碼:
// 這是命令模式的顧客 public class simpleOrderTest {public statci void main(Stringp[] args) {// 調用者,會傳入一個命令對象,可以用來發出請求SimpleOrder simpleOrder = new SimpleOrder();FishSoup fishSoup = new FishSoup();// 創建一個命令,將接收者傳給它FishSoupCommand fishSoupCommand = new FishSoupCommand(fishSoup);// 把命令傳給調用者simpleOrder.setCommand(fishSoupCommand);// 命令執行simpleOrder.orderUp();} }小結
命令模式將發出的對象和執行請求的對象解耦。
在被解耦的兩者之間是通過命令對象進行溝通的。命令對象封裝了接收者和一個或一組動作。
調用者通過調用命令對象的execute()發出請求,這會使得接收者的動作被調用。
調用者可以接受命令當做參數,甚至在運行時動態地進行。
命令可以支持撤銷,做法是實現一個undo()方法來回到execute()被執行前的狀態。
宏命令是命令的一種簡單的延伸,允許調用多個命令。宏方法也可以支持撤銷。
實際操作時,很常見使用聰明命令對象,也就是直接實現了請求,而不是將工作委托給接收者。
命令也可以用來實現日志和事務系統。
總結
以上是生活随笔為你收集整理的HeadFirst设计模式-命令模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “约见”面试官系列之常见面试题之第五十五
- 下一篇: 技术书籍也香艳-《Head First设