Commandパターンでは、4つの役割で表現する。
- Command
- Invorker
- Receiver
- Client
図1. それぞれの包含関係を表す。 |
ClientはInvorkerに指令を設定することが主な役割である。InvorkerはClientから通知を受けて、Commandを管理し、任意のタイミングで起動させる。
ReceiverはCommandで行われる動作の主体となる。指令(Command)を受けるもの(Receiver)としての役割がある。
各役割の行う機能に関しては、いくつか曖昧な観点があると思う。
- Clientはコマンド自体を知ることがあるのか。
- InvorkerにはCommandの実行タイミングを決める権限があるのか。
- InvorkerとReceiverは同一でもいいのか。
1の場合には、ClientがCommandAをInvorkerに設定するということを明示的に知っているのかどうかになる。ClientとInvorkerの間にレイヤーが介在して、レイヤーがCommandの詳細を司ることも考えられる。
2の場合には、Invorkerがレイヤーの役割を果たしているのか、そもそもの起動を役割としているのかである。レイヤーの役割だと、呼び出すCommandをどう扱うのかは、Invorkerに委ねられていると考える。起動を直接Clientから指示される場合も含めての抽象化であるとも考えられる。
3. C#でのEventHandlerを考えると、CommandはEventであるが、Receiverに相当するものはEventHanlderを所有するインスタンスである。Clientは外部にあるが、InvorkerもEventHandlerを所有するインスタンスであり、ややこしい。抽象的に考えている場合には、InvorkerとReceiverが同じであっても構わない。しかし具体的に考えた時に、ここにCommandPatternがあると考えるのは、少々つらい。Callbackパターンとして考えるほうがより具体的である。