ObserverDemo.java
/*
* 程序功能:演示Java提供的观察者模式的实现方法。
* 在Java中通过Observable类和Observer接口实现了观察者模式。
* 一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。例如在文档/视图结构中,文档被修改了,视图就会得到通知。
* java.util.Observable中有两个方法对Observer特别重要:
* 1、setChanged()方法:用来设置一个内部标志位注明数据发生了变化;
* 2、notifyObservers()方法:调用一个列表中所有的Observer的update()方法,通知它们数据发生了变化。
* Observer通过Observable的addObserver()方法把自己添加到这个列表中。这个列表虽然由Observable拥有,但Observable并不知道到底有哪些Observer正在观察等待通知。Observable只提供一个方法让Observer能把自己添加进列表,并保证会去通知Observer发生了变化。通过这种机制,可以有任意多个Observer对Observable进行观察,而不影响Observable的实现。
*/
package com.lwj.demo;
public class ObserverDemo {
public static void main(String[] args) {
SimpleObservable person=new SimpleObservable("陆武军",33);
System.out.println("————————在没有添加观察者之前————————");
System.out.println(person);
new SimpleObserver(person);//建立并添加观察者
System.out.println("————————在有了观察者之后————————");
person.setName("陆武军");//这里没有改变,将不会调用update()方法。
person.setName("王换兵");//这里改变了名字(name),将会调用update()方法。
}
}
SimpleObservable.java
package com.lwj.demo;
import java.util.Observable;
//这是被观察者,继承了Observable类,注意在改变了被观察者的数据时,如何操作?
public class SimpleObservable extends Observable {
private String name;
private int age;
public SimpleObservable(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
if(!name.equals(this.name)){
this.name = name;
super.setChanged();//只有在setChanged()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
}
super.notifyObservers();
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(this.age!=age){
this.age=age;
super.setChanged();
}
super.notifyObservers();
}
@Override
public String toString() {
return "SimpleObservable [name=" + this.name + ", age=" + this.age + "]";
}
}
SimpleObserver.java
package com.lwj.demo;
import java.util.Observable;
import java.util.Observer;
//实现观察者
public class SimpleObserver implements Observer {
public SimpleObserver(Observable o){
o.addObserver(this);//向被观察者注册自己
}
//update()方法由Observer的notifyObservers()方法调用执行
public void update(Observable arg0, Object arg1) {
System.out.println("SimpleObservable对象已改变:"+arg0);
}
}
运行结果:
————————在没有添加观察者之前————————
SimpleObservable [name=陆武军, age=33]
————————在有了观察者之后————————
SimpleObservable对象已改变:SimpleObservable [name=王换兵, age=33]