观察者模式

软件设计模式
2022-07-12 14:47 · 阅读时长3分钟
小课

观察者模式常用于多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并被自动更新。观察者模式又被称为发布-订阅模式、模型-视图模式,它是一种行为型模式。

下面实现一个简单的观察者模式,首先定义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方法来更新状态。

总结

观察者模式符合开闭原则,无需修改观察者或被观察者的相关代码即可新增观察者,另外在以上实现中,观察者和被观察者是抽象依赖,符合依赖反转原则。

设计模式观察者模式Observer