2

以下のコードは別の SO 投稿から取られたものです。実装されたすべてのメソッドの最後にすべてのリスナーに通知するループがあるのは見苦しいので、このコードを書くためのより良い方法があるのではないかと考えていました。これがばかげている場合は、私を許してくださいJava

注: インターフェイスに複数のメソッドを実装します。5 つのメソッドを実装します。

import java.util.*;

interface HelloListener {
    public void someoneSaidHello();
}


class Initiater {
    List<HelloListener> listeners = new ArrayList<HelloListener>();

    public void addListener(HelloListener toAdd) {
        listeners.add(toAdd);
    }

    public void sayHello() {
        System.out.println("Hello!!");

        // Notify everybody that may be interested.
        for (HelloListener hl : listeners)
            hl.someoneSaidHello();
    }
}


class Responder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}
4

3 に答える 3

2

学生としてオブザーバーパターンを実装したとき、抽象クラスとして作成しました。

import java.util.ArrayList;

/**
 * The observer pattern.
 * @author jiman 
 */
public abstract class Observed {

    private ArrayList<Observer> observers;

    public Observed() { views = new ArrayList<Observer>(); }

    public void registerObserver(Observer o) { observers.add(o); }

    public void removeObserver(Observer o) { observers.remove(o); }

    // call this method upon a mutation of the state of this object
    public void notifyObservers() { for (Observer o : observers) o.update(); }

}

オブザーバーはこのインターフェースから継承し、独自の更新メソッドを作成します。

public interface Observer {

    public void update();

}
于 2012-11-05T05:46:04.893 に答える
2

すべてのリスナーに通知する必要があるメソッドが複数ある場合は、ループを独自のメソッドにリファクタリングして、各通知メソッドから呼び出すことができます。

たとえば、javax.swing.AbstractButton のソース コードには、状態の変更などをリスナーに通知するための firestateChanged() メソッドがあります。

于 2012-11-05T05:44:19.043 に答える
1

これを行うのに役立つ 2 つのクラスが JDK に存在します。

オブザーバー(インターフェース) とオブザーバブル(クラス)

それらの使用方法の小さな例:

  class MyView implements Observer {

    public void update(Observable obs, Object x) {
      System.out.println("update(" + obs + "," + x + ");");
    }
  }

  /** The Observable normally maintains the data */
  class MyModel extends Observable {

    public void changeSomething() {
      // Notify observers of change
      setChanged(); // THIS IS IMPORTANT DON'T FORGET IT!
      notifyObservers();
    }
  }
于 2012-11-05T05:39:53.987 に答える