我如何使用观察者设计模式?

时间:2013-05-24 19:09:55

标签: java design-patterns

我需要将Observer设计模式用于学校项目,但我遇到了问题。 我有一个计时器和一个减少自身的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);}
}

}

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

1 个答案:

答案 0 :(得分: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可以添加到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);
            }
        }
    }
}

在程序中,我们使用IObserver实例注册实现Observable的实例。

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

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