说明
- @author blog.jellyfishmix.com / JellyfishMIX - github
- LICENSE GPL-2.0
定义
观察者模式(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>();@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(Message message) {for (Observer observer : observers) {observer.update(message);}}
}
观察者实现
实现了观察者感知消息的逻辑。
public class ConcreteObserverA implements Observer {@Overridepublic void update(Message message) {// do something 获取消息通知后,执行观察者的自定义逻辑System.out.println("ConcreteObserverA is notified.");}
}public class ConcreteObserverB implements Observer {@Overridepublic void update(Message message) {// do something 获取消息通知后,执行观察者的自定义逻辑System.out.println("ConcreteObserverOne is notified.");}
}
demo
- 示例化一个主题,向主题注册多个观察者,触发主题通知观察者。
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());}
}