---
tags: Behavioral Patterns
---
# 命令模式 Command
-[不錯的參考](https://notfalse.net/4/command-pattern)
---
當A要請求B執行任務時,A會呼叫B然後B在完成任務,在這種情況下A需直接和B進行溝通,就像A是老闆,他要交代員工B去做事情一樣,如下圖。我們稱做A為Sender,B為Reciver。

但如果Sender需要Reciver**做很多事**怎麼辦?就像是老闆非常忙碌,他沒辦法提醒每個人該做什麼事情,那該怎麼辦?這時**老闆(Sender)** 可以使用**備忘錄(Command)**。他將任務寫在備忘錄上,再經由**秘書(Invoker)** 把任務交給**員工(Receiver)** 完成。

### 架構

### 角色
**Command:** 用來宣告執行操作的interface / abstract class。
**ConcreteCommand:** Command的實體物件,通常會持有Receiver,並呼叫Receiver的功能來完成命令要執行的操作。
**Receiver(接收者):** 幹活的角色, 命令傳遞到被執行。
**Invoker(請求者):** 接收並要求執行命令。
**Client(裝配者):** 建立Command Object,組裝Command Object和Receiver
*Clinet並非客戶端的Client*
### The differences between Strategy and Command pattern
**Strategy pattern**
is used to specify **how something should be done**, and plugs into a larger object or method to provide a specific algorithm.
(same purpose but different approach)
**Command pattern**
is used to make an object out of **what needs to be done** -- to take an operation and its arguments and wrap them up in an object to be logged.
(different purpose)
> [name=貴全]