什么是观察者模式
观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
为什么用观察者模式
观察者模式可以方便地实现对象之间的松耦合,提高系统的可维护性和可扩展性。例如,当一个对象的状态发生变化时,我们可以通过观察者模式来避免紧耦合的代码,可以让多个观察者对象独立地对主题对象的状态变化做出响应。
工作中用在哪里
在Android开发中,观察者模式经常用在以下场景:
1)当用户点击一个按钮时,多个控件需要同时更新显示,此时可以使用观察者模式,让这些控件成为主题对象的观察者,当主题对象的状态发生变化时,通知观察者更新自己。
2)当用户需要实时获取某个数据时,可以将该数据作为主题对象,多个观察者监听该主题对象,当该数据发生变化时,主题对象通知所有观察者对象更新自己,这样可以实现实时更新数据。
3)当用户需要实现事件总线的功能时,可以使用观察者模式,通过注册观察者来监听事件的发生,当事件发生时,通知所有观察者处理相应的逻辑。
设计思路
在观察者模式中,主要包含以下几个角色:
1)抽象主题:定义了主题对象的接口,其中包含了添加、删除、通知观察者的方法。
2)具体主题:实现了抽象主题的接口,同时保存了观察者列表,并在状态发生变化时,通知所有观察者。
3)抽象观察者:定义了观察者的接口,其中包含了更新自己的方法。
4)具体观察者:实现了抽象观察者的接口,具体实现自己的更新逻辑。
观察者模式的代码实现
以观察者模式实现事件总线为例,代码实现如下:
1、抽象主题
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(Object obj);
}
2、具体主题
public class EventBus implements Subject{
private List<Observer> observerList = new ArrayList<>();
@Override
public void registerObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObservers(Object obj) {
for (Observer observer : observerList) {
observer.update(obj);
}
}
}
3、抽象观察者
public interface Observer {
void update(Object obj);
}
4、具体观察者
public class MainObserver implements Observer {
public MainObserver(Subject subject) {
subject.registerObserver(this);
}
@Override
public void update(Object obj) {
//处理逻辑
}
}
5、使用示例
EventBus eventBus = new EventBus();
MainObserver mainObserver = new MainObserver(eventBus);
//事件发生时,通知所有观察者
eventBus.notifyObservers(obj);
总结
观察者模式是一种常用的设计模式,它可以实现对象之间的松耦合,提高系统的可维护性和可扩展性。在Android开发中,观察者模式经常用于实现事件总线、多控件协作等功能。通过学习观察者模式,我们可以更好的理解面向对象设计的思想和原则,提高我们的设计水平和编码能力。