(09)观察者模式
概念
定义对象之间的一对多依赖关系(一个被观察者,多个观察者),当被观察者的状态发生改变时,所有的观察者都得到通知。也称为发布-订阅模式。
- 吃蛙来哒需要在大众点评APP叫号排队,有A/B/C三人都在大众点评APP叫号,等待APP通知什么时候去吃蛙来哒。那么APP与A/B/C三人就形成了一对多的依赖关系。可以理解成A/B/C三人订阅了大众点评APP,当APP通知什么时候用餐时,A/B/C三人都能得到相应的消息
- 被观察者:大众点评APP。观察者:用户A/B/C
实现方式
import java.util.ArrayList;
import java.util.List;
/**
* 观察者
*/
public class Demo {
public static void main(String[] args) {
App app = new App();
// app中添加两个观察者
app.add(new BinaryObserver());
app.add(new HexObserver());
// 当状态发生变化,则通知相应的观察者
app.setState(33);
//运行结果
//BinaryObserver 监听到状态发生变化:100001
//HexObserver 监听到状态发生变化:21
}
}
// 事件,当被观察者状态发生变化,则给观察者发送一个事件,一般事件中传递被观察者对象.
// 事件中还能记录发送时间等额外信息
class Event {
private App source;
public Event(App source) {
this.source = source;
}
public App getSource() {
return this.source;
}
}
// 被观察者
class App {
// 被观察者中,存储多个观察者
private List observerList = new ArrayList<>();
private int state;
public void add(Observer observer) {
observerList.add(observer);
}
// 状态改变,通知所有观察者
public void setState(int state) {
this.state = state;
observerList.forEach(t -> t.listener(new Event(this)));
}
public int getState() {
return state;
}
}
// 观察者接口。所有观察者类都要实现该接口
interface Observer {
void listener(Event event);
}
// 具体观察者
class BinaryObserver implements Observer {
public void listener(Event event) {
System.out.println("BinaryObserver 监听到状态发生变化:" + Integer.toBinaryString(event.getSource().getState()));
}
}
// 具体观察者
class HexObserver implements Observer {
public void listener(Event event) {
System.out.println("HexObserver 监听到状态发生变化:" + Integer.toHexString(event.getSource().getState()));
}
}
BinaryObserver 监听到状态发生变化:100001
HexObserver 监听到状态发生变化:21