目标(Intent):
建立在“一对多(one-to-many)”依赖关系的场景下,实现当一个对象状态发生变化时,所有依赖于这个对象的其他对象都能够自动获得通知并且自动被更新其状态。Publish-Subscribe
角色:
Subject:了解自己的观察者(Observers)。
Observer:定义update接口,该接口由Subject调用来更新Observer的状态
Java中的实现:
- java.util.Observable
subject.addObserver(o)
subject.hasChanged()
subject.notifyObservers()
和 java.util.Observer
observer.update(o, arg)
当subject状态发生改变时,调用setChanged方法,而后调用notifyObservers方法,进而调用Observer的update方法
好处:
被观察者,只需要知道谁在观察自己就可以了,不需要了解观察者的细节
当被观察者发生变化时,只需要广播消息即可,被观察者可以有选择的的广播,决定广播事件类型等,被观察者处于主动状态
观察者可以实时了解被观察者的状态,在多线程编程中消除了消息的耦合性
import java.util.Observable;
import java.util.Observer;
public class ObserverPattern {
public static void main(String[] args){
ObserverPattern op = new ObserverPattern();
op.testOb();
}
class ObSubject extends Observable{
private int height = 0;
public void setHieght(int h){
this.height = h;
this.setChanged();
if(this.hasChanged()){
this.notifyObservers(height);
}
}
}
static class ObObserver implements Observer{
private static int count = 0;
public void update(Observable o, Object arg) {
System.out.println(arg+" now changed !"+ count++);
}
}
public void testOb(){
ObSubject subject = new ObSubject();
for(int i=0;i<10;i++){
subject.addObserver(new ObObserver());
}
for(int j=0;j<100;j++){
subject.setHieght(j);
}
}
}