所谓观察者模式,是指当主题(subject)发生变化的时候,自动的将变化通知给关心主题变化的观察者(observer),这里的观察者一般是多个。
《Head First Design Patterns》给出的定义是:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
英文原文是:Observer defines an one-to-many dependency between objects so that one object changes state,all of its dependents are notified and updated automatically.
观察者模式的类图为:
代码实现:
package patterns.observer;
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
package patterns.observer;
public interface Observer {
public void update();
}
package patterns.observer.impl;
import java.util.ArrayList;
import java.util.List;
import patterns.observer.Observer;
import patterns.observer.Subject;
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state = 0;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for(Observer observer : observers) {
observer.update();
}
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObservers();
}
}
package patterns.observer.impl;
import patterns.observer.Observer;
public class ConcreteObserver implements Observer {
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject) {
this.subject = subject;
subject.registerObserver(this);
}
@Override
public void update() {
System.out.println(subject.getState());
}
}
在JDK中提供类似的接口和类:java.util.Observable类(对应Subject)和java.util.Observer接口。一般来讲,如果我们需要只需要扩展这些接口即可。
在实际工作中如何运用模式,是我们学习模式的本意。但是我对于模式的运用还停留在书本的例子上,希望大家探讨如何应用模式到我们具体的工作场景中去。