Java 观察者模式

Java 观察者模式,java,swing,observable,Java,Swing,Observable,我想实现一个应用程序,其中我有两个类(图形类和控制器类)。Mi的目的是准确地反映控制器类中发生的更改。我需要使用观察者模式来完成,但我不知道如何获得它 假装的工作如下所示: -在graphic类中,我有三个JPanel,我想在每个窗格着色之间间隔两秒 现在,我有以下代码: ----------------------可观测类-------------------------------------------- public class ImagenControl extends Observa

我想实现一个应用程序,其中我有两个类(图形类和控制器类)。Mi的目的是准确地反映控制器类中发生的更改。我需要使用观察者模式来完成,但我不知道如何获得它

假装的工作如下所示: -在graphic类中,我有三个JPanel,我想在每个窗格着色之间间隔两秒

现在,我有以下代码:

----------------------可观测类--------------------------------------------

public class ImagenControl extends Observable{
private String panel1,panel2,panel3;
private int counter;
private Timer colorTimer;
private ActionListener colorListener=new ActionListener() {

    public void actionPerformed(ActionEvent ae) {
        if (counter==0){
            panel1="yellow";
            setChanged();
        }
        else if (counter==1){
            panel2="blue";
            setChanged();
        }
        else if (counter==2){
            panel3="green";
            setChanged();
        }
        if (counter==2)
            colorTimer.stop();
        else counter++;
    }
};
public void giveColor(){
    counter=0;
    colorTimer=new Timer(2000,colorListener);
    colorTimer.start();
}
public class Imagen extends javax.swing.JFrame implements Observer{


public Imagen() {
    initComponents();
}
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
    ImagenControl ctr=new ImagenControl();
    ctr.giveColor();
}                                     

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new Imagen().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
// End of variables declaration                   

@Override
public void update(Observable o, Object o1) {

}
---------------------------观察员班----------------------------------------

public class ImagenControl extends Observable{
private String panel1,panel2,panel3;
private int counter;
private Timer colorTimer;
private ActionListener colorListener=new ActionListener() {

    public void actionPerformed(ActionEvent ae) {
        if (counter==0){
            panel1="yellow";
            setChanged();
        }
        else if (counter==1){
            panel2="blue";
            setChanged();
        }
        else if (counter==2){
            panel3="green";
            setChanged();
        }
        if (counter==2)
            colorTimer.stop();
        else counter++;
    }
};
public void giveColor(){
    counter=0;
    colorTimer=new Timer(2000,colorListener);
    colorTimer.start();
}
public class Imagen extends javax.swing.JFrame implements Observer{


public Imagen() {
    initComponents();
}
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
    ImagenControl ctr=new ImagenControl();
    ctr.giveColor();
}                                     

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new Imagen().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
// End of variables declaration                   

@Override
public void update(Observable o, Object o1) {

}
你会怎么做


提前谢谢

您需要将您的观察者链接到您的可观察对象。要做到这一点,在您的主包中(您正在创建观察者和可观察对象),您将有如下代码:

ImageController ic = new ImageController()
Imagen obs = new Imagen()

ic.addObserver(obs)
现在在观察者的更新方法中,您实现了当观察者通知其观察者时希望发生的事情

最后,您可以使用Observable的
setChanged()
方法来指示Observable中的某个东西已经改变。下次被观察者调用
notifyobservators()
时,所有注册的观察者都会被告知发生了更改


请注意,如果在
notifyObservators()
之前未调用
setChanged()
,则不会通知任何观察者(因为没有任何要通知他们的内容)

您将要将观察者链接到您的可观察对象。要做到这一点,在您的主包中(您正在创建观察者和可观察对象),您将有如下代码:

ImageController ic = new ImageController()
Imagen obs = new Imagen()

ic.addObserver(obs)
现在在观察者的更新方法中,您实现了当观察者通知其观察者时希望发生的事情

最后,您可以使用Observable的
setChanged()
方法来指示Observable中的某个东西已经改变。下次被观察者调用
notifyobservators()
时,所有注册的观察者都会被告知发生了更改


请注意,如果在
notifyobservators()
之前未调用
setChanged()
,则不会通知任何观察者(因为没有什么可以通知他们的)

在MVC中,控制器永远不是被观察者,而是观察者。事件发生在GUI或模型上,控制器将更新从一个路由到另一个。在MVC中,控制器永远不是观察者,而是观察者。事件发生在GUI或模型上,控制器将更新从一个路由到另一个。