import java.util.*;
/**
* <p>
* 使用Observer模式的例子。
* 自己的手机号码更改后,自己的朋友自动得到通知。
* </p>
*
* @author not attributable
* @version 1.0
*/
public class ObserverDesignPattern extends Observable {
public ObserverDesignPattern() {
super();
//有两个朋友
addFriend(new Friend("Tom"));
addFriend(new Friend("Jerry"));
}
public void addFriend(Friend n){
super.addObserver(n);
}
/**
* 手机号码改变
* @param l long
*/
public void modifyPhoneNumber(final long l){
/*
*表明状态已经改变,不调用不会通知观察者
*/
setChanged();
//通知其他人自己的号码改变
notifyObservers(new Long(l));
}
class Friend implements Observer{
private String name;
/**
* @param name 朋友的姓名
*/
public Friend(String name) {
this.name=name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void update(Observable o, Object arg) {
if(arg instanceof Long){
System.out.println(name+"已经知道你的手机号码改为:"+arg);
}
}
}
public static void main(String[] args) {
ObserverDesignPattern op = new ObserverDesignPattern();
//更改手机号码
System.out.println("我手机号码更改为13516816888!");
op.modifyPhoneNumber(Long.parseLong("13516816888"));
}
}
/* java.util.Observable中有两个方法对Observer特别重要,一个是setChange()方法用来设置一个内部标志位注明数据发生了变化;一个是notifyObservers()方法会去调用一个列表中所有的Observer的update()方法,通知它们数据发生了变化。
Observer通过Observable的addObserver()方法把自己添加到这个列表中。这个列表虽然由Observable拥有,但Observable并不知道到底有哪些Observer正在观察等待通知。Observable只提供一个方法让Observer能把自己添加进列表,并保证会去通知Observer发生了变化。通过这种机制,可以有任意多个Observer对Observable进行观察,而不影响Observable的实现。
*
*
*/