2012年4月6日 星期五

Design Pattern–Command

  • class diagram

  • sequence diagram

在實際應用方面, 可以想像一下我們到一家餐廳點餐後的流程, 其實就很像command pattern裡所說的, 首先:
  1. 客戶(client)進到店裡, 坐下準備點餐
  2. 服務生(Invoker)開始為顧客點餐(new command())
  3. 客戶點了n樣菜, 於是服務生記下來(SetCommand())
  4. 服務生把點菜單送到廚房(execute())給廚師(Receiver)準備做菜(action())
執行command的人為reciever, 下達指令的是client, 幫忙記錄者為invoker, 這就是design pattern裡的command模式。程式碼在google上面可以找到一大堆, 這裡就偷懶不寫了, 相信看得懂class diagram和sequence diagram的人很快就可以寫出這種模式的sample code。
真正在大型開發案裡, 這種模式還算常被用到, 首先我們開了一個介面給外部的人呼叫, 但為了統一介面, 我們通常只會使用一個export function, 像是RetCode ExecuteCommand(long CMD_ID, const void* input, void* output), 接下來會在ExecuteCommand裡用switch case來dispatch command, 到這一部為止, 就可以使用command模式來包裝, 把執行ExecuteCommand當成是client來setCommand, 後面內部的實作就用command模式包起來, 如此一來一個command對應一個command class, 要新增或是改變receiver的action也就方便許多, 不同的command也可以有不同的receiver來action()。

沒有留言: