android中的Observer模式,是继承自java的实现,使用Observable类和Observer实现。
Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
应用场景
- 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
- 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
优缺点
observer模式的优点
- Subject和Observer之间是松耦合的,分别可以各自独立改变。
- Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
- 遵守大部分GRASP原则和常用设计原则,高内聚、低耦合。
observer模式的缺点
- 松耦合导致代码关系不明显;
- 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历);
- 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
实现
1. 创建被观察者类,继承自java.util.Observable类;
public class HousePriceObservable extends Observable {
private int price=0;
public int getPrice() {
return price;
}
public void setPrice(int i) {
price = i;
setChanged();
notifyObservers();
}
}
HousePriceObservable是被观察者,当它的数据发生变化,调用
setChanged();
notifyObservers();
通知它的观察者。
2. 创建观察者类,它实现java.util.Observer接口;
要实现Observer接口的唯一方法update
public class HousePriceObserver implements Observer {
public void update(Observable o,Object arg) {
HousePriceObservable m = (HousePriceObservable) o;
System.out.println("HousePrice has changed to "+ m.getPrice());
}
}
HousePriceObserver是观察者,当他的被观察者HousePriceObservable 执行了notifyObservers()方法后,它会调用update()方法。
3.对于被观察者需要调用addObserver()方法,添加它的观察者列表。
void addObserver(Observer o)
测试代码
HousePriceObservable mHousePriceObservable = new HousePriceObservable();
HousePriceObserver mHousePriceObserver = new HousePriceObserver();
mHousePriceObservable.addObserver(mHousePriceObserver);
mHousePriceObservable.setPrice(1);
mHousePriceObservable.setPrice(2);
mHousePriceObservable.setPrice(3);