定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
观察者模式允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
观察者模式存在2类角色:
- 发布者(Publisher):将自身的状态改变通知给其他对象
- 订阅者(Subscriber):关注发布者状态变化的对象
该机制实现中,需要定义用于存储订阅者对象引用的列表成员变量,和新增用于添加或删除列表中订阅者的方法。当发布者状态发生变化时,会主动遍历订阅者列表,调用通知方法。
代码实现:
//通知接口
public interface EventListener {
void update();
}
//发布者
public class EventManager {
//订阅列表
private Set<EventListener> listeners=new HashSet<>();
//删除订阅者
public void removeListener(EventListener listener) {
listeners.remove(listener);
}
//添加订阅者
public void addListeners(EventListener listener) {
this.listeners.add(listener);
}
public void notify(){
//遍历并通知所有订阅者
for (EventListener listener : listeners) {
listener.update();
}
}
}
// 订阅者
public class MailEventListener implements EventListener{
@Override
public void update() {
System.out.println("update");
}
}
EventManager eventManager=new EventManager();
//注册
eventManager.addListeners(new MailEventListener());
// 当发布者状态变化时,调用通知的接口
eventManager.notify();
虽然 java 中提供了 Observer
接口和 Observable
类用于实现观察者模式,但是很少用,而且 JDK 也已经将其标记为废弃,一般都是业务自定义实现观察者模式。
观察者模式的优点是将发布者与订阅者解耦,无需改变发布者代码就能引用新的订阅者。
缺点是通知的顺序是随机的。