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

如果有多个方法需要通知所有侦听器,则可以将循环重构为可以从每个通知方法调用的自己的方法。

例如,javax.swing.AbstractButton 的源代码有一个 firestateChanged() 方法,用于通知监听器状态变化等。

于 2012-11-05T05:44:19.043 回答
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 回答
1

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 回答