2

我需要为学校项目使用观察者设计模式,但我遇到了问题。我有一个计时器和一个自减的 int,我想做一个观察者,所以当 int 变为 0 时,会弹出一个 jdialog。

这是我的代码:

 public class Joc extends JPanel implements ActionListener {
 javax.swing.Timer t1;
 int time=0,
 MyObservator obs = new MyObservator();

   public Joc()
   { ... // constructor stuff
    t1=new javax.swing.Timer(1000, (ActionListener) this);
    t1.start();}

   public void actionPerformed(ActionEvent e) {
   if(time>0) {time--;}
   else {}
   }

// 我的观察者类

public class MyObservator implements Observer{
Joc joc;
MyJDialog dialog;

 @Override
public void update(Observable o, Object arg) {
    if(joc.time==0)
    {dialog.setVisible(true);}
}

}

我不明白如何使用观察者,如何添加观察者以及如何使其发挥作用?

4

1 回答 1

3

使用观察者模式,您可以从观察者的基本接口开始。当特定事件发生时,观察者的通知方法将被其他一些类调用。

public interface IObserver {

    public void notify(int i);
}

现在接口需要一个实现:

public class Observer implements IObserver {

    @Override
    public void notify(int i) {
        if(i % 1000 == 0){
            System.out.println("One thousand iterations elapsed.");
        }
    }

}

可观察者需要观察一些东西。因此,创建了一个包含IObservers. 请注意,IObserver可以将 s 添加到Observable. 如果需要,addObserver可以在接口中指定该方法,然后由Observable. 另请注意,当特定事件发生时,Observable该类会调用该方法。notify收到这些事件的IObserver通知,并且可以在它们发生时执行任何操作。在我们的示例中,如果int是 1000,我们将一些文本打印到控制台。

public class Observable {

    private List<IObserver> observers = new ArrayList<IObserver>();

    public void addObserver(IObserver observer){
        this.observers.add(observer);
    }

    public void execute(){
        for(int i = 0; i < 10000; i++){
            for(IObserver observer: observers){
                observer.notify(i);
            }
        }
    }
}

在一个程序中,我们注册使用实例实现IObserverObservable实例。

public static void main(String[] args) {
    Observable observable = new Observable();
    observable.addObserver(new Observer());
    observable.execute();
} 

在您的示例中,Joc该类等效于Obserable该类。它应该包含一个 s 列表,并在通过该方法Observer发生特定事件时通知它们。update

于 2013-05-24T19:26:57.253 回答