Observer模式
Observer模式的功用,是希望两个(或多个)对象,我们称之为Subject和Observer,当一方的状态发生改变的时候,另一方能够得到通知。也就是说,作为Observer的一方,能够监视到Subject的某个特定的状态变化,并为之做出反应。
Java代码实现
import java.util.Observable;
//被观察的对象,需要继承 Observable 而且在方法中,必须要this.setChanged(),
//只有这样,观察者才能被通知到
public class SubjectObservable extends Observable{
public void changeDate(){
System.out.println("SubjectObservable changeDate");
this.setChanged();
}
}
class Subject{
SubjectObservable f = new SubjectObservable();
//注册观察者
public void registerObserver(java.util.Observer o){
f.addObserver(o);
}
void changeSubject(){
f.changeDate();
//通知观察者,这里的通知,只有f的this.setChanged()触发后才生效。
f.notifyObservers();
}
}
//一号观察者,需要实现 java.util.Observer ,并且 要重写update() 方法
class SubjectObserver implements java.util.Observer {
public void update(Observable o, Object arg) {
SubjectObservable subject=(SubjectObservable) o;
System.out.println("SubjectObserver work ");
}
}
//二号观察者,同样需要实现 java.util.Observer ,并且 要重写update() 方法
class SubjectObserver2 implements java.util.Observer {
public void update(Observable o, Object arg) {
SubjectObservable subject=(SubjectObservable) o;
System.out.println("SubjectObserver2 work ");
}
}
Main函数
public static void main(String args[]){
Subject s = new Subject();
SubjectObserver fm = new SubjectObserver();
SubjectObserver2 fm2 = new SubjectObserver2();
//给s对象注册2个观察者
s.registerObserver(fm2);
s.registerObserver(fm);
s.changeSubject();
}
执行结果:
SubjectObservable changeDate
SubjectObserver work
SubjectObserver2 work
System.out.println("SubjectObservable changeDate");
this.setChanged();
}
}
class Subject{
SubjectObservable f = new SubjectObservable();
//注册观察者
public void registerObserver(java.util.Observer o){
f.addObserver(o);
}
void changeSubject(){
f.changeDate();
//通知观察者,这里的通知,只有f的this.setChanged()触发后才生效。
f.notifyObservers();
}
}
//一号观察者,需要实现 java.util.Observer ,并且 要重写update() 方法
class SubjectObserver implements java.util.Observer {
public void update(Observable o, Object arg) {
SubjectObservable subject=(SubjectObservable) o;
System.out.println("SubjectObserver work ");
}
}
//二号观察者,同样需要实现 java.util.Observer ,并且 要重写update() 方法
class SubjectObserver2 implements java.util.Observer {
public void update(Observable o, Object arg) {
SubjectObservable subject=(SubjectObservable) o;
System.out.println("SubjectObserver2 work ");
}
}
Main函数
public static void main(String args[]){
Subject s = new Subject();
SubjectObserver fm = new SubjectObserver();
SubjectObserver2 fm2 = new SubjectObserver2();
//给s对象注册2个观察者
s.registerObserver(fm2);
s.registerObserver(fm);
s.changeSubject();
}
执行结果:
SubjectObservable changeDate
SubjectObserver work
SubjectObserver2 work