观察者模式(Observer Design Pattern) 也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的:
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
中文翻译: 在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。
从模型来讲,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。不过,在实际的项目开发中,这两种对象的称呼是比较灵活的,有各种不同的叫法,比如: Subject-Observer, Publisher-Subscriber, Producer-Consumer, EventEmitter-EventListener, Dispatcher-Listener。不管怎么称呼,只要应用场景符合定义,都可以看作观察者模式。
从定义中可以知道,观察者模式主要应用于通知的场景,并且通知的主题可能会频繁的改变。观察者模式可以解耦被观察者与观察者。
定义了观察者感知消息的能力。
public interface Observer {
void update(Message message);
}
定义了操作观察者的能力。
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(Message message);
}
实现了操作观察者的能力。
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(Message message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
实现了观察者感知消息的逻辑。
public class ConcreteObserverA implements Observer {
@Override
public void update(Message message) {
// do something 获取消息通知后,执行观察者的自定义逻辑
System.out.println("ConcreteObserverA is notified.");
}
}
public class ConcreteObserverB implements Observer {
@Override
public void update(Message message) {
// do something 获取消息通知后,执行观察者的自定义逻辑
System.out.println("ConcreteObserverOne is notified.");
}
}
public class Demo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.registerObserver(new ConcreteObserverA());
subject.registerObserver(new ConcreteObserverB());
subject.notifyObservers(new Message());
}
}