业务场景
(1)比如我们有一个目标对象,一旦这个目标对象的状态改变了,然后的话就去通知相关的对象,我的状态改变了,数据也变化了
观察者模式常见于基于zookeeper进行分布式系统之间的协调工作,比如分布式锁的注册以及监听是否释放。
还有就是两个系统之间如果做了异步的处理,那么如果A系统发送异步请求给了B系统,但是要得到B系统的一个状态改变的消息,可以采用观察者模式。
基于zookeeper去做分布式锁
(1)系统A尝试获取zookeeper上的一个锁,获取到了
(2)系统B尝试获取zookeeper上的一个锁,被系统A给锁了,没有获取到锁,此时系统B在zookeeper上可以注册一个监听器(观察者)
(3)系统A一旦将锁给释放了,zookeeper感受到锁被释放了,就会立即通知系统B注册的那个监听器
(4)系统B就立即被通知到了,系统A释放了锁,系统B可以重新尝试在zookeeper上加锁
import java.util.Observable;
import java.util.Observer;
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject(0);
Observer observer = new ConcreteObserver();
subject.addObserver(observer);
subject.setState(1);
subject.setState(2);
}
public static class Subject extends Observable {
private Integer state;
public Subject(Integer state) {
this.state = state;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
// 在这里状态就改变了
this.state = state;
// 通知关联的一些观察者,说我的状态变化了
this.setChanged();
this.notifyObservers();
}
}
public static class ConcreteObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
Subject subject = (Subject) o;
Integer state = subject.getState();
System.out.println("目标对象的状态变化成:" + state);
}
}
}