■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);
ふむ,これでMediatorとColleagueの関連ができたぁ.
そして,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に書き換える~ (ソース)
trackback for this entry URL:
http://blog.graffiti-web.org/mt/mt-tb.cgi/324