参考:http://www.cnblogs.com/wader2011/archive/2011/11/19/2254981.html
介绍
observer模式定义对象间的一对多的依赖关系 ,当一个对象(被观察者)的状态改变的时候 ,所有 的依赖于它的对象(观察者)
都 得到通知并被自动更新。
Observer是观察者,而Observable是被观察的目标。
相关类的介绍
1. observable类
继承它的类表示程序想要观察的对象 ,一个observable对象可以有一个or多个观察者。观察者是实现 Observer接口的任意对象 ,
一个Oberver实例改变后,调用 Observable的notifyObservers方法的应用程序 会通过调用观察者的update方法来通知观察者这个
实例发生了什么。
重要的几个方法
void addObserver(Observer o)
如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。未指定向多个观察者发送通知的顺序。
clearChanged()
指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。notifyObservers 方法自动调用此方法。
int countObservers ()
返回 Observable 对象的观察者数目。
void deleteObserver (Observer o)
从对象的观察者集合中删除某个观察者。向此方法传递 null无效。
deleteObservers()
清除观察者列表,使此对象不再有任何观察者。
boolean hasChanged ()
测试对象是否改变。当且仅当在此对象上最近调用了 setChanged 方法时才返回 true;否则返回 false。
notifyObservers(0
如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 null。换句话说,此方法等效于: notifyObservers(null)
notifyObservers(Object arg)
如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 arg 参数。 arg 可以是任意对象
setChanged ()
标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。
Observer类接口
这个接口只有一个未实现 的抽象接口 update ,实现这个接口的对象成为观察者同。注册了这个对象 (观察者)的对象(ers被观察者)实例调用
notifyObservers()后,观察者会自动 执行update 方法.
void update(Observable o ,Object arg)
o--被观察者
arg--notifyObservers方法的参数
实例
该实例模拟了烧水的过程,涉及三个对象,Heater(热水器),Display(显示器),Alarm(报警器).
模拟过程:为了便于运行,水的初始化温度为90,沸点为95,显示器依据热水器显示温度,显示器显示温度为95时,报警器开始报警。明显可以看出Heater是subject ,Display 是它的 Obsrver,同时Display亦是subject,因为它要被报警器观察,所以Alarm是Display的Observer.
package Observer;
import java.util.Observable;
public class Heater extends Observable{
private int temp ;
public int getTemp() {
return temp;
}
public void setTemp(int temp) {
this.temp = temp;
}
public void boilWater (){
for (int i =90; i<110; i++){
temp = i;
setChanged() ;
notifyObservers() ;
}
}
}
然后
package Observer;
import java.time.temporal.Temporal;
import java.util.Observer;
import java.util.Observable;
public class Display extends Observable implements Observer{
private String status = "未开" ;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public void update(Observable arg0, Object arg1) {
displayTemp(((Heater)arg0).getTemp()) ;
}
private void displayTemp(int temp ){
if (temp >100){
setStatus("沸腾");
setChanged() ;
notifyObservers(Integer.valueOf(temp)) ;
}
System.out.println("状态: " + status + " 现在温度: " + temp);
}
}
然后
package Observer;
import java.util.Observable;
import java.util.Observer;
public class Alarm implements Observer{
private void makeAlarm(Integer temp ){
System.out.println("temp:"+ temp);
System.out.println("滴滴,水开了");
}
public void update(Observable arg0, Object arg1) {
makeAlarm((Integer)arg1) ;
}
}
测试类中
package Observer;
public class TestObserver {
public static void main (String [] args){
Heater heater = new Heater() ;
Display display = new Display() ;
Alarm alarm = new Alarm() ;
heater.addObserver(display) ;
display.addObserver(alarm) ;
heater.boilWater() ;
}
}
优点
缺点
原文:http://www.cnblogs.com/chuiyuan/p/4382116.html