我们这里简单用代码描述如下:
package observer.desc;
/**
*
*作者:alaric
*时间:2013-8-13下午8:05:08
*描述:抽象观察者
*/
public interface Observer {
public void update();
}
package observer.desc;
/**
*
*作者:alaric
*时间:2013-8-13下午8:05:34
*描述:具体观察者
*/
public class ConcreteObserver implements Observer{
@Override
public void update() {
// 写业务逻辑
}
}
package observer.desc;
/**
*
*作者:alaric
*时间:2013-8-13下午8:05:55
*描述:抽象主题
*/
public interface Subject {
public void attach(Observer observer);
public void detach(Observer observer);
void notifyObservers();
}
package observer.desc;
import java.util.Enumeration;
import java.util.Vector;
/**
*
*作者:alaric
*时间:2013-8-13下午8:09:21
*描述:具体主题类
*/
public class ConcreteSubject implements Subject {
private Vector<Observer>observersVector = new Vector<Observer>();
public void attach(Observer observer) {
observersVector.addElement(observer);
}
public void detach(Observer observer) {
observersVector.removeElement(observer);
}
public void notifyObservers() {
Enumeration<Observer>enumeration = observers();
while (enumeration.hasMoreElements()) {
((Observer) enumeration.nextElement()).update();
}
}
@SuppressWarnings("unchecked")
public Enumeration<Observer> observers() {
return ((Vector<Observer>) observersVector.clone()).elements();
}
}
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)
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);
}
}
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);
}
}
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);
}
}
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