Android设计模式之观察者模式
一、定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
二、核心角色:
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
五、优缺点:
优点
解耦性强:被观察者无需了解具体观察则细节,仅依赖接口。
扩展灵活:可动态增删观察者,支持多级事件触发。
缺点
性能损耗:大量观察者或高频通知会引发性能问题。
潜在内存泄漏:需要注意观察者生命周期,避免持有无效引用。