jdk1.6中API文档如下描述:
public interface Observer
一个可在观察者要得到 observable 对象更改通知时可实现 Observer 接口的类。
从以下版本开始:
JDK1.0
另请参见:
Observable
public class Observableextends Object
此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察的对象。
一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。
未指定发送通知的顺序。Observable 类中所提供的默认实现将按照其注册的重要性顺序来通知 Observers,但是子类可能改变此顺序,从而使用非固定顺序在单独的线程上发送通知,或者也可能保证其子类遵从其所选择的顺序。
注意,此通知机制与线程无关,并且与 Object 类的 wait 和 notify 机制完全独立。 新创建一个 observable 对象时,其观察者集是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。
从以下版本开始:
JDK1.0
另请参见:
notifyObservers(), notifyObservers(java.lang.Object), Observer, Observer.update(java.util.Observable, java.lang.Object)
举个例子,如果你看过TVB的警匪片,你就知道卧底的工作方式。一般一个警察可能有几个卧底,潜入敌人内部,打探消息,卧底完全靠他的领导的指示干活,领导说几点行动,他必须按照这个时间去执行,如果行动时间改变,他也要立马改变自己配合行动的时间。领导派两个卧底去打入敌人内部,那么领导相当于抽象主题,而督察警官张三这个人派了两个卧底李四和万王五,张三就相当于具体主题,卧底相当于抽象观察者,这两名卧底是李四和王五就是具体观察者,派的这个动作相当于观察者在主题的登记。那么这个类图如下:
利用javaAPI来实现,代码描述如下:
Java代码
package observer;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
*
*作者:alaric
*时间:2013-8-13下午9:32:40
*描述:警察张三
*/
public class Police extends Observable {
private String time ;
public Police(List<Observer> list) {
super();
for (Observer o:list) {
addObserver(o);
}
}
public void change(String time){
this.time = time;
setChanged();
notifyObservers(this.time);
}
}
Java代码
package observer;
import java.util.Observable;
import java.util.Observer;
/**
*
*作者:alaric
*时间:2013-8-13下午9:32:59
*描述:卧底A
*/
public class UndercoverA implements Observer {
private String time;
@Override
public void update(Observable o, Object arg) {
time = (String) arg;
System.out.println("卧底A接到消息,行动时间为:"+time);
}
}
Java代码
package observer;
import java.util.Observable;
import java.util.Observer;
/**
*
*作者:alaric
*时间:2013-8-13下午9:33:14
*描述:卧底B
*/
public class UndercoverB implements Observer {
private String time;
@Override
public void update(Observable o, Object arg) {
time = (String) arg;
System.out.println("卧底B接到消息,行动时间为:"+time);
}
}
Java代码
package observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Observer;
/**
*
*作者:alaric
*时间:2013-8-13下午9:32:26
*描述:测试
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
UndercoverA o1 = new UndercoverA();
UndercoverB o2 = new UndercoverB();
List<Observer> list = new ArrayList<>();
list.add(o1);
list.add(o2);
Police subject = new Police(list);
subject.change("02:25");
System.out.println("===========由于消息败露,行动时间提前=========");
subject.change("01:05");
}
}
测试运行结果:
卧底B接到消息,行动时间为:02:25
卧底A接到消息,行动时间为:02:25
===========由于消息败露,行动时间提前=========
卧底B接到消息,行动时间为:01:05
卧底A接到消息,行动时间为:01:05
观察者模式的优点是只要订阅/登记了之后,当被观察者改变时,观察者能自动更新。跟JMS一样,消息发布者发出消息时,只要注册过的都会收到消息。 |