command pattern

なんだかよくわからないけれど、いつもしっくりこないパターン。
例えば PowerPlant だとコマンドは LCommander で表現され、LCommander の派生クラスはコマンドチェーンに継れる。
コマンドチェーンはカレントを管理する。例えばウィンドウがフォーカスされるとそのウィンドウがコマンドチェーンのカレントになる。
ここまでのお膳立てがあればコマンドパーサーはカレントのコマンドに対してメッセージを送信するだけ。あとは、チェーン上のコマンドが順次処理してくれる。
なので、コマンドは自分で処理しなければならない受信メッセージか否か?の判定を行う必要がある。SmallTalkObjective-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)

とか書けるので…

だめだ、眠いのでまた今度。