Android编程设计模式之观察者模式实例详解
在Android开发中,观察者模式是一种非常常见且重要的设计模式,它主要用于解决对象间的依赖关系,特别是当一个对象的改变需要通知到多个其他对象时,这种模式显得尤为有效,本文将通过一个详细的实例来讲解观察者模式在Android中的应用。
一、观察者模式
观察者模式定义了对象间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都会得到通知并被自动更新,它主要包含以下几个角色:
1、Subject(抽象主题/被观察者):维护一组观察者列表,并提供增加、删除和通知观察者的接口。
2、Observer(抽象观察者):定义一个更新接口,当被观察者状态发生变化时,观察者需要实现该接口以接收通知。
3、ConcreteSubject(具体主题):具体实现了Subject接口,通常在内部状态变化时通知所有注册的观察者。
4、ConcreteObserver(具体观察者):实现了Observer接口,在接收到通知后进行相应的更新操作。
二、观察者模式的UML类图
+-----------------------+ | ConcreteSubject | +-----------------------+ | observers: List | | + register(observer) | | + remove(observer) | | + notify() | +-----------------------+ ^ | +-----------------------+ | Observer | +-----------------------+ | + update(message) | +-----------------------+
三、简单实现
为了更好地理解观察者模式,我们可以通过一个简单的追剧实例来实现这一模式,假设我们有一个电视剧类Teleplay
,当电视剧有新剧集发布时,所有订阅该剧的用户都会收到通知。
抽象观察者类
public interface Observer { void update(String message); }
抽象被观察者类
public interface Observable { void push(String message); void register(Observer observer); }
具体的观察者类
public class User implements Observer { private String name; public User(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + ", " + message + " 更新了!"); } }
具体的被观察者类
import java.util.ArrayList; import java.util.List; public class Teleplay implements Observable { private List<Observer> list = new ArrayList<>(); @Override public void push(String message) { for (Observer observer : list) { observer.update(message); } } @Override public void register(Observer observer) { list.add(observer); } }
实现
public class Client { public static void main(String[] args) { // 被观察者,这里就是用户订阅的电视剧 Teleplay teleplay = new Teleplay(); // 观察者,这里就是订阅用户 User user1 = new User("小明"); User user2 = new User("小光"); User user3 = new User("小兰"); // 订阅 teleplay.register(user1); teleplay.register(user2); teleplay.register(user3); // 推送新消息 teleplay.push("xxx电视剧"); } }
输出结果:
小明, xxx电视剧 更新了! 小光, xxx电视剧 更新了! 小兰, xxx电视剧 更新了!
四、Android源码中的观察者模式
在Android源码中,观察者模式也得到了广泛应用,以下是一些常见的应用场景:
1、BaseAdapter:在ListView的适配器中,BaseAdapter继承了SpinnerAdapter和ListAdapter,并通过notifyDataSetChanged方法通知UI更新,当数据源发生变化时,调用notifyDataSetChanged方法通知ListView重新绘制。
public abstract class BaseAdapter { protected void notifyDataSetChanged() { mDataSetObservable.notifyChanged(); } }
2、BroadcastReceiver:广播接收器也是一种观察者模式的应用,应用可以注册广播接收器来监听系统或其他应用发出的广播,当手机电量低时,系统会发出广播,所有注册了该广播的应用都会收到通知。
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_LOW); BroadcastReceiver receiver = new MyBroadcastReceiver(); registerReceiver(receiver, filter);
3、EventBus:EventBus是一个发布/订阅模式的事件总线,广泛应用于Android事件传递,它简化了组件间的通信,避免了复杂的依赖关系,EventBus可以在Activity和Fragment之间传递数据。
EventBus.getDefault().post(new MessageEvent());
4、RxJava:RxJava是一个使用可观察序列进行异步编程的库,它基于观察者模式,提供了强大的响应式编程能力,通过RxJava可以轻松实现网络请求的数据流处理。
observable.subscribe(new Observer<String>() { @Override public void onNext(String s) { // Update UI with the latest data from network } });
5、LiveData:在Android架构组件中,LiveData也是一种基于观察者模式的设计,它用于在生命周期感知的组件中观察数据变化,确保数据的一致性,ViewModel中的数据变化会通知到观察它的Activity或Fragment。
MutableLiveData<String> liveData = new MutableLiveData<>(); liveData.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { // Update UI with the latest data from ViewModel } });
五、相关问题与解答栏目
1、什么是观察者模式?
观察者模式是一种行为型设计模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新,在Android中,这种模式常用于GUI系统、订阅——发布系统等场景,帮助解耦UI层和业务逻辑层。
2、观察者模式的优点和缺点是什么?
优点:
解耦:将被观察者和观察者解耦,减少它们之间的依赖性。
扩展性:可以方便地添加新的观察者,而不需要修改现有的代码。
灵活性:观察者和被观察者的职责分明,便于维护和扩展。
缺点:
性能问题:如果观察者数量过多,通知过程可能会影响性能。
复杂性:对于简单的场景,使用观察者模式可能会增加系统的复杂性和理解难度。
小伙伴们,上文介绍了“Android编程设计模式之观察者模式实例详解”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/639640.html