還記得命令模式的其中一個特色是支持 "可復原" 的操作嗎?這要怎麼實現呢?
首先,我們在'Command介面中加入
undo()函式,讓各個命令實作要去實作
undo()`這個方法。
/*程式碼待補*/
以電燈命令為例,因為execute()
的內容是開啟電燈─light->on()
,那undo()
自然就是關閉電燈─light->off()
。
/*程式碼待補*/
其他命令也是依此類推。例如稍微複雜一點的,還有速度屬性的吊燈操作:
/*程式碼待補*/
下一步,就是讓遙控器的undo()
按鈕知道上一次被呼叫的命令,以知道undo按下時要執行哪個command的undo()
。因此,遙控器每次被按下時-onButtonWasPushed()
或offButtonWasPushed()
,除了要執行對應命令的execute()
,還要將undoCommand
更新為按下的那個命令。
/*程式碼待補*/
可以來測試一下:
/*程式碼待補*/
進階一點,如果我們想要可以復原好幾個步驟以前的動作呢?那我們保留的 undoCommand 可以不只是一個command,而是一個command陣列,然後就用pop的方式來呼叫它們的undo()
。
現在都有一些智慧設定,可以一鍵設置合適的冷氣、燈、音響等等,要怎麼在不更改遙控器設計的情況下做到呢?可以思考一下─ 我們可以實作一個MacroCommand
,讓它的成員有一個command陣列,而execute就讓它們全部都執行!
/*程式碼待補*/
請求佇列化
我們可以把命令放在一個工作佇列中,並交由執行緒來執行這個動作:從佇列移出一個command並進行execute()
,然後丟棄後取下一個,這就可以時做排程器、thread pool等等。這就讓工作佇列與實際進行的執行緒不耦合。
紀錄請求
ActionListener