observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
下面给出一个代码示例:
package kellerdu.demo;
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"));
}
}
程序运行结果:
我手机号码更改为13516816888!
Jerry已经知道你的手机号码改为:13516816888
Tom已经知道你的手机号码改为:13516816888