Java.use(better);

前の記事次の記事
Java.use(better);


Episode#08《改訂版》

Command パターンの応用 -- GoF を反面教師に


《関連記事》


《改訂版》

  • Scala に準拠するように、クラス/メソッドの名前を変更しました。

《目的》
Command パターンを適用した事例を通して、その理解を深めます。また、分業プログラミングを支援するハリウッドの原則〔= Hollywood Principle〕について紹介します。

《動機》
Swing コンポーネントを利用するときに面倒なのは、登録すべきリスナーと、イベントを処理するメソッドとの組み合わせです。しかし、利用者(プログラマー)にとって興味があるのは、コンポーネントを利用して、何を実行をしたいのかということです。それ以外の情報は、提供者(プログラマー)だけが知っていればいいことです。何かうまい仕掛はないものでしょうか。

■ イベント処理

次のアプリケーションを事例に話を進めます。

□ 重複しないコードの断片に特化したい

メニュー項目 Quit を選択すると、アプリケーションが終了します。これを実現するコードの断片では、

    JMenuItem quitMenu = new JMenuItem("Quit");
    new ButtonClicked() {
      public void execute() { System.exit(0); }
    }.listenTo(quitMenu);

抽象クラス ButtonClicked を具現化した、無名クラスのインスタンスを用意して、指定したコンポーネント quitMenu で発生するイベントに傾聴 listenTo します。この手法は、実現すべきメソッドが簡潔で、コードの断片が「重複しない」ときに便利です。

ButtonClicked の利用者は、リスナーやイベントの詳細を知りません。メニュー項目を選択したときに実行 execute したい処理を記述するだけです。(後述するように)ButtonClicked の提供者は、リスナーを登録 addActionListener して、〔when〕イベント ActionEvent が発生したときに〔how〕メソッド actionPerformed を介して処理を依頼します。

ハリウッドの原則」に従うなら、利用者(プログラマー)は、いつどのように〔when/how〕して情報をアクセスするかを制御できません。それを決定するのは、提供者(プログラマー)です。この原則に従って、前述したコードの断片の意図を読み解くと、次のようになります。

    JMenuItem メニュー項目 = new JMenuItem("Quit");
    new ボタンをクリックしたときに() {
      public void 実行したいことは() { ここに書いてあります; }
    }.に傾聴します(メニュー項目);

 ↑ TOP

》作業中です《

update*13/01/26 19:51:54

♪ 花見車(はなみぐるま)



出典 ☞ http://shimayu.co.jp/modules/myalbum/photo.php?lid=93