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