下面的代码来自另一篇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...");
}
}
答案 0 :(得分:2)
如果有多个方法需要通知所有侦听器,则可以将循环重构为可以从每个通知方法调用的自己的方法。
例如,javax.swing.AbstractButton的源代码有一个firestateChanged()方法,用于通知侦听器状态更改等。
答案 1 :(得分:2)
当我作为学生实现Observer模式时,我将其作为一个抽象类:
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();
}
答案 2 :(得分:1)
JDK中存在两个类来帮助您完成此任务。
Observer(接口)和Observable(类)
关于如何使用它们的一个小例子:
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();
}
}