定義對象間的一種1對多的依賴關(guān)系,每當(dāng)這個對象的狀態(tài)改變時,其它的對象都會接收到通知并被自動更新。
觀察者模式有以下角色:
- 抽象被觀察者:將所有已注冊的觀察者對象保存在一個集合中。
- 具體被觀察者:當(dāng)內(nèi)部狀態(tài)發(fā)生變化時,將會通知所有已注冊的觀察者。
- 抽象觀察者:定義了一個更新接口,當(dāng)被觀察者狀態(tài)改變時更新自己。
- 具體被觀察者:實現(xiàn)抽象觀察者的更新接口。
簡單示例
1、抽象觀察者
public interface IObserver {
void update(String msg);
}
2、具體觀察者
public class ObserverImpl implements IObserver {
@Override
public void update(String msg) {
System.out.println("this is ObserverImpl "+hashCode()+" "+msg);
}
}
3、抽象被觀察者
public interface IObservable {
public void registerObserver(IObserver o);
public void removeObserver(IObserver o);
public void notifyObservers(String message);
}
4、具體被觀察者
public class ObservableImpl implements IObservable {
private List<IObserver> mList = new ArrayList();
@Override
public void registerObserver(IObserver o) {
mList.add(o);
}
@Override
public void removeObserver(IObserver o) {
if (mList != null) {
mList.remove(o);
}
}
@Override
public void notifyObservers(String message) {
for (IObserver observer : mList) {
observer.update(message);
}
}
}
5、使用
@Test
public void testObserver() {
IObservable observable = new ObservableImpl();
ObserverImpl observer1 = new ObserverImpl();
observable.registerObserver(observer1);
ObserverImpl observer2 = new ObserverImpl();
observable.registerObserver(observer2);
observable.notifyObservers("testObserver");
}
this is ObserverImpl 693632176 testObserver
this is ObserverImpl 326549596 testObserver
- 實現(xiàn)了觀察者和被觀察者之間的抽象耦合,容易擴展。
- 有利于建立一套觸發(fā)機制。
- 一個被觀察者卡頓,會影響整體的執(zhí)行效率。采用異步機制可解決此類問題。