观察者模式常用于多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并被自动更新。观察者模式又被称为发布-订阅模式、模型-视图模式,它是一种行为型模式。
下面实现一个简单的观察者模式,首先定义Subject和Observer接口。
1interface Observer<T> {
2 void update(T t);
3}
4
5interface Subject<T> {
6
7 void register(Observer<T> observer);
8
9 void unregister(Observer<T> observer);
10
11 void notifyObservers(T t);
12}
Subject接口定义了注册观察、取消观察和通知所有观察者的方法,Observer接口定义了更新方法,当被观察者更新时会触发回调该方法,下面是具体的实现类MySubject和MyObserver。
1public class MyObserver implements Observer<String> {
2 @Override
3 public void update(String s) {
4 System.out.println(s);
5 }
6}
7
8class MySubject implements Subject<String> {
9
10 private final Set<Observer<String>> observers = new HashSet<>();
11
12 public void register(Observer<String> observer) {
13 this.observers.add(observer);
14 }
15
16 public void unregister(Observer<String> observer) {
17 this.observers.remove(observer);
18 }
19
20 public void notifyObservers(String msg) {
21 for (Observer<String> o : observers) {
22 o.update(msg);
23 }
24 }
25
26 public void post(String msg) {
27 //...
28 notifyObservers(msg);
29 }
30}
当被观察者msg信息有更新时,会在处理完后调用notifyObservers方法通知所有的观察者,并调用其update方法来更新状态。
观察者模式符合开闭原则,无需修改观察者或被观察者的相关代码即可新增观察者,另外在以上实现中,观察者和被观察者是抽象依赖,符合依赖反转原则。