参考: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