1. 观察者模式概述
当对象间存在一对多关系时,则使用观察者模式。
比如,当一个对象被修改时,则会自动通知依赖它的对象。
(1) 适用情况
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。
(2) 优点
异步,观察者和被观察者是松耦合的。
(3) 缺点
当观察者过多,广播通知时会花费很多时间。
2. 观察者模式实例
小明、小红和小亮都想买商家的宝贝,但是目前没有货,于是他们都等着,一旦商家到货,就立刻买下宝贝。
这里没有处理多线程和超卖的问题,只是展示观察者模式的思想。
(1) 实现主题类,也就是商家
public class Subject {
private List<Observer> observers = new ArrayList<>();
private int stock;
public void addObserver(Observer observer) {
observers.add(observer);
}
public void setStock(int stock) {
this.stock = stock;
// 提醒所有观察者
notifyAllObservers();
}
private void notifyAllObservers() {
for (Observer observer : observers) {
if (stock > 0) {
observer.buy();
stock--;
} else {
System.out.println("宝贝被抢光啦!");
}
}
}
}
(2) 实现观察者类,也就是买家
public class Observer {
private String name;
public Observer(String name) {
this.name = name;
}
public void buy() {
System.out.println(name + ": 我抢到了宝贝!");
}
}
(3) 开始抢购
public class ObserverDemo {
public static void main(String[] args) {
// 创建一个主题,也就是商家
Subject subject = new Subject();
// 创建三个观察者,也就是买家
Observer observer1 = new Observer("小明");
Observer observer2 = new Observer("小红");
Observer observer3 = new Observer("小亮");
// 三个买家都想买商家的宝贝,于是都注册到商家
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.addObserver(observer3);
// 商家上货啦
subject.setStock(2);
}
}
运行结果:
3. 一些思考
观察者模式是一种很实用的模式,被观察者不用再同步阻塞着等待被观察者的状态改变。spring中的监听器就是使用了观察者模式的思想。