在java中观察者模式,更好的方法?

时间:2012-11-05 05:34:32

标签: java

下面的代码来自另一篇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...");
                }
            }

3 个答案:

答案 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();
    }
  }
相关问题