OOPで考えるActionScript Step05





this is flash contents.

■Step05 ~Mediatorパターンを取り入れる~

ソース

 各自作のコンポーネント同士の関連性はできるだけ排除した方がいい.
でも,関連性を持たせないと動かない.(あたりまえだ)
特にGUIのプログラムをするときにコンポーネントごとの
接続をするにはMediatorパターンなんかがよく使われる(ようです).
例に漏れずボクもこのパターンを全体的な制御に使っていてとても便利だなぁと思う.

 今回このコンテンツの監視役(Mediator)として[classes]->[MarioMediator]を作成した.
Colleague役としてコントローラー,プレーヤー,カウンターになる.
で紹介されているのはMediator役がColleague役を作成して,そのColleagueのインスタンスに対して
setMediator()メソッドでColleague役にMediatorを持たせている.

しかし,FlashではインスタンスはIDE上でタイムラインに配置する.
だのでMediatorではなくFlashPlayerがインスタンスを生成する.
つまり,Mediator側からColleagueを知ることができない.
なので,Colleagueのコンストラクタ側に処理を書きColleague側からMediator
を取得し,MediatorにColleagueを設定している.
Mediator役の取得はMediator役をSingletonにして取得するようにしている.

その部分のスクリプトを見てみると

// このコンポーネントの監視役に登録
var objMarioMediator = _global.study.MarioMediator.getInstance();
objMarioMediator.setPlayer(this);

ふむ,これでMediatorColleagueの関連ができたぁ.
そして,Colleagueが変更すると自身を引数にしてMediator
colleagueChanged()が呼ばれる.
自身を引数にするということはColleague側の状態がわかるような機構を作って
あげないとMediatorが状態を把握できない.
今回はColleague側にaction(行おうとしている動作)ととstatus(現状の状態)を
用意した.

そのColleagueから来ている変化の通知を処理している部分を見てみよう.

/**
* Colleagueとなるクラスに変更があった際に呼び出される.
*
* @param  Object
* @return  Void
*/
_global.study.MarioMediator.prototype.colleagueChanged = function(objColleague) {
  // コントローラーに変化があった場合
  if (objColleague == this._objController) {
    if (objColleague.getAction() == 'pressA') {
      if (objColleague.getStatus() == 'normal') {
        this._objPlayer.jump();
      }
    }
  }
};

と,まー,見たまんまです.
コントローラーの状態と行われたアクションをチェケラして
その状態にふさわしい行動を行う.司令塔ですね.

リスト
■Step00 ~序章~
■Step01 ~とにかく実装編~ソース
■Step02 ~自分のことは自分で編~ソース
■Step03 ~クラス定義とObject.registerClass()~ソース
■Step04 ~MVCを意識して~ソース
■Step05 ~Mediatorパターンを取り入れる~ソース
■Step06 ~AS2.0に書き換える~ソース


contributor nao : 2005年10月03日 02:30

trackback

trackback for this entry URL:
http://blog.graffiti-web.org/mt/mt-tb.cgi/324

comment