0. 序
不知道怎麼寫序了 遇到了乙個之前未遇到的模式。
這一章看到尾確實是太僵硬了,後面會附上我在這章的練習**!
1. 命令模式
命令模式將「請求」封裝成物件,以便使用不同的請求,佇列或者日誌來引數化其他物件,命令模式也支援可撤銷的操作。
命令模式可將「動作請求者」從「動作執行者」物件中解耦。例如:按下按鈕後,遙控器就要把電燈開啟,那麼在此遙控器的實現中就有電燈物件的直接參與造成耦合。–> 如何解耦–> 把請求封裝(如開啟電燈)成乙個特定物件,那麼,如果該按鈕儲存乙個命令物件,那麼當按鈕按下後,就可以命令物件做相應的工作,而不需要知道工作內容是什麼。
例子:餐廳中客人點餐,服務員拿了訂單,服務員把訂單放到視窗,廚師根據訂單準備餐點。在這裡訂單即封裝了點餐請求(發出命令),服務員傳遞訂單到視窗(命令傳遞),這裡服務員不需要知道訂單上有什麼,已經訂單給誰。廚師準備餐點(命令實現)。
空物件的使用 指的是不幹任何事的物件,可用避免在使用該種類物件時判斷if(command!=null) command.execute();
使用空物件只管呼叫execute()即可,如果為空的話它什麼也不會做(p214)
class
onecommand
implements
commend
}class
nocommand
implements
commend
}
2. exercise code
個人因為這一章的模式之前未接觸過,在看書的過程中有似懂非懂的感覺 過完這一章後來梳理一下**
例子:遙控器的實現
public
class
light
;public
void
off();
}
//先不使用命令模式 對乙個遙控器該如何實現
/** * 假設遙控器有三個槽
* 每個槽對應開 關 兩個按鈕 on off
*/public
class 遙控器
else
if(slot1==door)..
..}.
..}//很顯然 這裡會有很多if-else 並且如果新增加乙個槽的功能,就要加乙個if-else 不好維護
因此,採用命令模式,將遙控器的指令封裝起來–command, 該封裝帶有乙個執行方法execute(), 在獲取command物件後執行execute()即可完成命令
/**
* 封裝命令的物件
*/public
inte***ce
command
/**
* 燈亮
*/public
class
lightoncommand
implements
command
@override
public
void
execute()
}
/**
* 遙控器
*/public
class
remotecontrol
public
void
setslot
(command slot)
public
void
button1_1pressed()
}//測試
public
static
void
main
(string[
] args)
實現多個槽的遙控器 並帶有撤銷命令 關於撤銷操作,書中的想法很簡單,拿出乙個變數來記錄上一次的命令,若撤銷按下則執行該變數記錄的命令的undo方法,這裡我在想把undo也可撤銷,如果要實現這一功能的話就需要記錄下undo對應的功能和槽號了。
高階的撤銷功能,狀態撤銷–電風扇的「低,中,高 」三檔
/**
* 風扇類
*/public class ceilingfan
public void high()
public void medium()
public void low()
public void off()
public int getspeed()
}
//高命令 中 低 關閉命令類似
public
class
ceilingfanhighcommand
implements
command
@override
public
void
execute()
@override
public
void
undo()
}
//測試
ceilingfan ceilingfan_room=new ceilingfan("房間");
ceilingfanhighcommand ceilingfanhighcommand=new ceilingfanhighcommand(ceilingfan_room);
celifanmediumcommand celifanmediumcommand=new celifanmediumcommand(ceilingfan_room);
celifanlowcommand celifanlowcommand=new celifanlowcommand(ceilingfan_room);
celifanoffcommand celifanoffcommand=new celifanoffcommand(ceilingfan_room);
advancedremotecontrol.setcommand(4,ceilingfanhighcommand,celifanoffcommand);
advancedremotecontrol.setcommand(5,celifanmediumcommand,celifanoffcommand);
advancedremotecontrol.setcommand(6,celifanlowcommand,celifanoffcommand);
advancedremotecontrol.hasonbuttonwaspressed(4);//高
advancedremotecontrol.hasonbuttonwaspressed(5);//中
advancedremotecontrol.undobuttonwaspressed();
當前執行:房間 high
當前執行:房間 medium
當前執行:房間 high
3. 擴充套件
一趟走下來發現命令模式其實就是 把一堆的指令封裝起來(封裝成command) 呼叫者只需要 對command執行execute()即可,不需要關心該命令如何實現的,不關心該命令的接收者,實現解耦。 即 風扇是乙個接收者,開啟/調速風扇是指令,將這種指令封裝成命令(command) ,在命令封裝的過程中就已經確定了該命令的接收者(構造器構造), 再然後在遙控器(呼叫者)上設定按鈕對應的命令,只要按鈕被按下就執行execute()方法。
這種情況下,工作佇列中的類與進行運算的執行緒之間是完全解耦的,執行緒只需要執行佇列中的execute()方法即可,而不必關係這個物件是去讀取網路資料還是進行數學計算。
6 命令模式
head first design patterns master src headfirst designpatterns command 把方法呼叫封裝起來,可以把運算塊包裝成形。定義 將 請求 封裝成物件,以便使用不同的請求,佇列或者日誌來引數化其他物件,命令模式也支援可撤銷的操作。例子 餐廳...
HeadFirst 設計模式學習筆記6 命令模式
1.這一節我們的任務是建立乙個類似智慧型家居的萬能遙控器,控制各種家電。我們需要將 請求 封裝成物件 乙個命令物件通過在特定接收者上繫結一組動作來封裝請求 以便使用不同的請求 佇列 或者日誌來引數化其物件 這就是命令模式。2.我們具體來看乙個例子 首先我們要完成對命令的物件封裝 只有乙個方法,所有的...
設計模式6
template method模式 我們講的前面很多模式的思路都是使用組合,而不用繼承。並且也提到了乙個設計原則 優先使用組合 但是這個模式就是乙個使用繼承來解決問題的思路。畢竟,繼承也不是一無是處。在有些系統中,乙個事務的完成需要通過一系列的步驟,就是第一步幹什麼,第二步幹什麼。這個步驟的序列是固...