設計模式:命令模式
定義:“請求”封裝成對象脊框,以便使用不同的請求壕曼,隊列或者日志來參數化其他對象,命令模式也支持可撤銷的操作。
命令模式通過在特定的接收者上綁定一組動作來封裝一個請求仇穗,這個對象只會暴露一個execute方法,當次方法被調用的時候戚绕,接收者就會進行這些動作纹坐。
命令模式的設計支持請求調用者和請求接收者之間的解耦。
命令模式的更多用途:隊列請求
命令模式可以將運算塊打包(一個接收者和一組動作)舞丛,然后將它傳來傳去耘子,就像是一般的對象一樣果漾。
想象有一個工作隊列:你在某一端添加命令,然后另一端則是線程谷誓。線程進行下面的動作:從隊列中取出一個命令绒障,然后調用execute()方法,等待這個調用完成捍歪,然后將此命令對象丟掉户辱,再取出下一個命令。糙臼。焕妙。。
命令模式的更多用途:日志請求
某些應用需要我們將所有的動作的記錄在日志中弓摘,并能在系統(tǒng)死機之后焚鹊,重新調用這些動作回復到之前的狀態(tài)。通過新增兩個方法(store()和load())韧献,命令能夠實現(xiàn)這一點末患,在Java中我們可以利用對象序列化實現(xiàn)這些方法,但是一般認為序列化最好還是只用在對象的持久化上锤窑。
對更高級的應用而言璧针,這些技巧可以擴展到應用事物處理中,也就是說一整群操作必須全部進行完成渊啰,或者沒有進行任何操作探橱。
要點
- 命令模式將發(fā)出請求的對象和執(zhí)行請求的對象解耦
- 在被解耦的兩者之間是通過命令對象進行溝通的,命令對象封裝了接收者和一個或一組動作
- 調用者通過調用命令對象的execute()發(fā)出請求绘证,這回使得接受者的動作被調用
*調用者可以接受命令當做參數隧膏,甚至可以在運行時動態(tài)的進行 - 命令模式可以支持撤銷,做法是實現(xiàn)一個undo()方法來 回調到execute()被執(zhí)行前的狀態(tài)
- 宏命令是命令的一種簡單的延伸嚷那,允許調用多個命令胞枕。宏方法也可以支持撤銷
- 實際操作時,很常見使用“聰明”命令對象魏宽,也就是直接實現(xiàn)了請求腐泻,而不是將工作委托給接收者
- 命令也可以用來實現(xiàn)日志和事物系統(tǒng)