command pattern
なんだかよくわからないけれど、いつもしっくりこないパターン。
例えば PowerPlant だとコマンドは LCommander で表現され、LCommander の派生クラスはコマンドチェーンに継れる。
コマンドチェーンはカレントを管理する。例えばウィンドウがフォーカスされるとそのウィンドウがコマンドチェーンのカレントになる。
ここまでのお膳立てがあればコマンドパーサーはカレントのコマンドに対してメッセージを送信するだけ。あとは、チェーン上のコマンドが順次処理してくれる。
なので、コマンドは自分で処理しなければならない受信メッセージか否か?の判定を行う必要がある。SmallTalk や Objective-C の Message-passing をゴリゴリやっている感じ。
こんな感じだった気がする。
void ConcreteCommander::ListenToMessage(MessageT inMessage, void* ioParam) { if (inMessage == MyMessage) { /* なんか処理をする */ return; } /* 次のコマンドに移譲する */ super::ListenToMessage(inMessage, ioParam); }
勢いこんなコードを書いてみたり。
void ConcreteCommander::ListenToMessage(MessageT inMessage, void* ioParam) { switch (inMessage) { case MyMessage: /* なんかする */ return; case MyMessageToo: /* こっちでもなんかする */ return; } /* 次のコマンドに移譲する */ super::ListenToMessage(inMessage, ioParam); }
うーん。こんなものなのかね?
たとえば、boost::function(だっけ?) や loki::Functor ベースで考えると。
Functor fun(pObj, &ConcreteCommander::MemFun)
とか書けるので…
だめだ、眠いのでまた今度。