iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
自我挑戰組

設計模式探索系列 第 20

[Day 20] 命令模式 (4)

  • 分享至 

  • xImage
  •  

復原按鈕

還記得命令模式的其中一個特色是支持 "可復原" 的操作嗎?這要怎麼實現呢?
首先,我們在'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


上一篇
[Day 19] 命令模式 (3)
下一篇
[Day 21] 轉接器與門面模式 (1)
系列文
設計模式探索30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言