2

コンポーネントにメッセージを送信して、必要に応じて自分自身を変更できるようにする特殊なオブジェクト クラスがあります。オブジェクト クラスを使用すると、コンポーネントを組み合わせて組み合わせることができるため、巨大な継承ツリーを持たなくても、同様の機能を持つさまざまなオブジェクトを作成できます。(これはコンポーネントパターンと呼ばれていると思います。)ここで私がやりたいことは次のとおりです。

//MyObject.java
public class MyObject {

    private HashSet<MyComponent> components_;

    void send(Message message) {
        for (MyComponent component : components_) {
            component.receive(message);
        }
    }

    // other unrelated methods and variables...

}

// MyComponent.java
public interface MyComponent {

    public void receive(Message message);

    // other unrelated methods...

}

// RendererComponent.java
public class RendererComponent implements MyComponent {

    public void receive(Message message) {
        if (message.getType() == Message.Type.POSITION_CHANGED) {
            Point positionDifference = message.getInfo();
            redraw(positionDifference);
        } else if (message.getType() == Message.Type.SCORE_CHANGED) {
            Integer score = message.getInfo();
            redraw(score);
        } // else if...
    }

    private void redraw(Point positionDifference) {
        // draws item at new position...
    }

    private void redraw(Integer score) {
        // draws the new score...
    }

    // other unrelated methods and variables..
}

多くのコンポーネントがあり、それらはさまざまな種類のメッセージを受け取ります。さまざまなクラス タイプの情報を取得できるように Message クラスを作成するにはどうすればよいですか? コンポーネント クラスがメッセージを処理する方法を変更する必要がありますか?

4

2 に答える 2

1

コンポーネントにメッセージを送信して、必要に応じて自分自身を変更できるようにする特殊なオブジェクト クラスがあります。

この種のことを行う通常の (そして簡単な) 方法は、Java の内部イベント発行メカニズムを使用することです。イベントを表すクラスと、イベント リスナー/コンシューマーが「イベント発生」コールバック メソッドで実装する必要があるインターフェイスを定義します。イベント プロデューサーには、イベント コンシューマーを登録するための register メソッドがあり、登録されたコンシューマーのリストを保持します。プロデューサーがイベントを送信する場合、イベント オブジェクトを作成し、登録されているすべてのコンシューマーに対して「イベント発生」コールバックを呼び出します。

このアプローチは、Java の GUI ライブラリ全体やその他の場所で使用されています。それは軽量で効率的です...そしておそらくメッセージパッシングによってこの種のことを行うよりも良い考えです.


イベントについて学び始めるのに適した場所は、Swing チュートリアルのイベント リスナーの紹介です。

于 2012-06-25T03:52:09.707 に答える
1

パブリッシュ/サブスクライブ (またはパブリッシュ/サブスクライブ) システムが必要なようです。EventBusGuava ライブラリの実装を確認してください。

于 2012-06-25T05:12:10.010 に答える