什么是观察者模式
观察者模式又叫做发布订阅模式,类似于微信公众号,一个发布端,多个接收端。
观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
通俗的讲,就是在被观察类中,持有一个观察类的集合,然后在数据改变的时候,遍历所有观察类,调用更新方法。
实现观察者模式
建立观察者模式的步骤
- 编写观察者接口和被观察者的接口
- 实现观察者和被观察者
- 注册观察者
- 通知观察者
编写观察者接口和被观察者的接口
java
中已经准备了这两个接口,观察者接口Observer
和被观察者类Observable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| public interface Observer { void update(Observable observable, Object data); } public class Observable { List<Observer> observers = new ArrayList<Observer>(); boolean changed = false; public Observable() {}
public void addObserver(Observer observer) { if (observer == null) { throw new NullPointerException("observer == null"); } synchronized (this) { if (!observers.contains(observer)) observers.add(observer); } } protected void clearChanged() { changed = false; } public int countObservers() { return observers.size(); } public synchronized void deleteObserver(Observer observer) { observers.remove(observer); } public synchronized void deleteObservers() { observers.clear(); } public boolean hasChanged() { return changed; } public void notifyObservers() { notifyObservers(null); } @SuppressWarnings("unchecked") public void notifyObservers(Object data) { int size = 0; Observer[] arrays = null; synchronized (this) { if (hasChanged()) { clearChanged(); size = observers.size(); arrays = new Observer[size]; observers.toArray(arrays); } } if (arrays != null) { for (Observer observer : arrays) { observer.update(this, data); } } } protected void setChanged() { changed = true; } }
|
实现观察者和被观察者
1 2 3 4 5 6 7 8 9 10 11 12
| public class Observer1 implements Observer{ public void update(Observable observable, Object data) { Log.i("Observer1", "change"); } } public class Subject extends Observable{ public void change(){ setChanged(); notifyObservers();通知所有观察者 }
}
|
注册观察者
1 2 3
| Subject s = new Subject(); Observer1 o1 = new Observer1(); s.addObserver(o1);
|
通知观察者