一、定義:定義對象間一種一對多的依賴關系,使得每當一個對象改變狀態,則所有依賴于它的對象都會得到通知并被自動更新。
二、核心角色:
? ? ? ? Subject:抽象主題被觀察的角色,管理觀察者集合,提供注冊/注銷方法,定義通知邏輯。
? ? ? ? ConcreteSubject:具體主題,存儲具體狀態數據,狀態變更時觸發通知。
? ? ? ? Observer:抽象觀察者,定義更新接口,使得主題狀態發生變化時更新自己。
? ? ? ? ConcreteOberver:具體觀察者,實現抽象觀察者的更新接口,以便主題狀態發生變化時更新自身狀態。
三、簡單代碼示例:
// 觀察者接口
public interface Observer {
? ? void update(String message);
}
// 被觀察者抽象類
public abstract class Subject {
? ? private List<Observer> observers = new ArrayList<>();
? ? public void attach(Observer observer) {
? ? ? ? observers.add(observer);
? ? }
? ? public void detach(Observer observer) {
? ? ? ? observers.remove(observer);
? ? }
? ? public void notifyObservers(String message) {
? ? ? ? for (Observer observer : observers) {
? ? ? ? ? ? observer.update(message);
? ? ? ? }
? ? }
}
// 具體被觀察者(如網絡請求模塊)
public class NetworkManager extends Subject {
? ? public void onDataReceived(String data) {
? ? ? ? notifyObservers(data); // 數據到達時通知觀察者
? ? }
}
// 具體觀察者(如UI組件)
public class UIComponent implements Observer {
? ? @Override
? ? public void update(String message) {
? ? ? ? Log.d("ObserverDemo", "更新UI:" + message);
? ? }
}
NetworkManager manager = new NetworkManager();
manager.attach(new UIComponent());
manager.onDataReceived("新數據"); // 觸發UIComponent的update()
?
四、Android中的應用場景
1.事件驅動機制:按鈕點擊監聽,ListView或RecyclerView的Adapter通過notifyDataSetChanged()通知視圖刷新,BroadcastReceiver。
2.數據綁定與狀態同步:ContentObserver監聽數據庫變化,LiveData實現數據驅動UI更新
3.跨模塊通信:EventBus,RxBus
五、優缺點:
優點
? ? ? ? 解耦性強:被觀察者無需了解具體觀察則細節,僅依賴接口。
? ? ? ? 擴展靈活:可動態增刪觀察者,支持多級事件觸發。
缺點
? ? ? ? 性能損耗:大量觀察者或高頻通知會引發性能問題。
? ? ? ? 潛在內存泄漏:需要注意觀察者生命周期,避免持有無效引用。