“在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,一来它的对象都会收到通知”
场景:
某一个对象(或者数据)更新了,其他的一些类也要跟着变化,比如,在Android中,某个数据发生了改变,多处的UI要同时随之变化。
解决思路:
1.建立一个被监听的内容类(Observable),这个类实现一个接口,里面有三个主要方法,register,unregister,notifyObserver。
notifyObserver方法当监听对象发生变化时调用,把这个消息告诉所有的监听者(Observer)
register方法提供给Observer 这注册使用,Observer调用此方法后,就能收到notifyObserver传来的消息
unregister用来取消注册
2.所有的监听者实现Observer接口。该接口主要有一个update方法,当监听对象发生变化时,这个方法会被调用
public class Publisher implement Observable { //构建一个列表,里面放着所有订阅了这个监听对象的监听者的引用 private ArrayList<Observer> observerList; public Publisher() { observerList = new ArrayList<Observer>; } @Override public void register(Observer ob) { observerList.add(ob); //注册其实就是把这个监听者的引用加入到上面那个队列里 } @Override public void unregister(Observer ob) { int index = observerList.indexOf(o); if (index >= 0) { observerList.remove(index); } } //其实就是拿出上面那个list里的所有监听者,然后依次调用他们的update方法 @Override public void notifyObserver() { for(int i = 0; i < observerList.size(); i++) { observerList.get(i).update; } } } public class Subscriber() implement Observer { private Publisher publisher; //初始化的时候需要告诉监听者具体要监听谁 public Subscriber(Publisher publisher) { this.publisher = publisher; publisher.register(this); } @Override public void update() { //收到消息后的处理 } }
在Android中的应用:Otto EventBus
Otto 是Android系统的一个Event Bus模式类库。用来简化应用组件间的通信Read more: http://blog.chengyunfeng.com/?p=450
Otto的用法:在组件的相关生命周期中通过Bus类的register 函数来注册,然后Bus类会扫描改类中带有@Produce和 @Subscribe 注解的函数。
@Subscribe 注解告诉Bus该函数订阅了一个事件,该事件的类型为该函数的参数类型;而@Produce注解告诉Bus该函数是一个事件产生者,产生的事件类型为该函数的返回值。
post方法用来发布一个事件
register方法:
1. 首先把这个页面的所有pushisher和Subscribers 全部遍历出来,我们重点看Subscriber, 遍历Subscribers的核心代码如下:
Map<Class<?>, Set<EventHandler>> foundHandlersMap = handlerFinder.findAllSubscribers(object); //取出这个object里所有带subscribe装饰器的函数 for (Class<?> type : foundHandlersMap.keySet()) { //遍历这些函数 Set<EventHandler> handlers = handlersByType.get(type); //看看这些函数有没有已经被注册过 if (handlers == null) { //concurrent put if absent Set<EventHandler> handlersCreation = new CopyOnWriteArraySet<EventHandler>(); handlers = handlersByType.putIfAbsent(type, handlersCreation); if (handlers == null) { handlers = handlersCreation; } } final Set<EventHandler> foundHandlers = foundHandlersMap.get(type); handlers.addAll(foundHandlers); //如果没有,就把这些函数放入handlersByType里,handlersByType就相当于标准实现里的observerList }
2.当一个新的消费发出时,会调用post方法:
public void post(Object event) { if (event == null) { throw new NullPointerException("Event to post must not be null."); } enforcer.enforce(this); Set<Class<?>> dispatchTypes = flattenHierarchy(event.getClass()); boolean dispatched = false; for (Class<?> eventType : dispatchTypes) { Set<EventHandler> wrappers = getHandlersForEventType(eventType); //从handlersByType里拿出相应的方法,这个是根据传进来的class类型来过滤的 if (wrappers != null && !wrappers.isEmpty()) { dispatched = true; for (EventHandler wrapper : wrappers) { enqueueEvent(event, wrapper); } } } if (!dispatched && !(event instanceof DeadEvent)) { post(new DeadEvent(this, event)); } dispatchQueuedEvents(); }
相关推荐
Android设计模式--观察者模式DEMO 观察者模式是一个使用频率非常高的模式,他最常用的地方是GUI系统和订阅-发布系统。 该模式的最重要的作用就是解耦,使观察者和被观察者之间依赖尽可能小,甚至好无依赖。
总之,观察者模式在Android开发中扮演着重要角色,它能帮助我们构建松耦合、可扩展的系统,提高代码的复用性和可维护性。正确地理解和应用观察者模式,对于成为一名优秀的Android开发者至关重要。
本文将深入探讨一种常用的设计模式——观察者模式(Observer Pattern),并结合Android实际应用给出实例解析。 观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,...
在Android开发中,观察者模式(Observer Pattern)和订阅者模式(Subscriber Pattern)是两种重要的设计模式,它们在实现事件驱动编程中起着关键作用。本文将深入探讨这两种模式的概念、工作原理以及在Android开发中...
在Android开发中,设计模式是提升代码质量和可维护性的重要工具。本文将深入探讨其中的一种...在实际项目中,观察者模式与其他设计模式(如工厂模式、单例模式)结合使用,可以构建出更健壮、可扩展的Android应用程序。
观察者模式是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个背景下,我们以Android中的TextView为例,来深入...
### Android设计模式概述 #### 设计模式定义 设计模式是软件工程领域的一个重要概念,它代表着在特定场景下解决常见问题的有效方法。对于Android开发者而言,了解并掌握这些设计模式能够帮助他们编写更加高效、可...
观察者模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理事件响应和组件间的通信。这个模式允许对象订阅另一个对象的状态变化,当被观察的对象发生改变时,所有订阅者都会被通知并...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这种模式被广泛应用于事件驱动编程和异步通信中。在Android...
观察者模式(Observer Pattern)是另一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。例如,AbstractCursor 类就是一个观察者模式的例子。 Android 设计模式系列还...
在Android开发中,设计模式是提升代码质量和可维护性的重要工具。设计模式是对软件设计中常见问题的解决方案的模板,经过时间和实践的检验,能够帮助开发者有效地解决复杂性问题,提高代码的重用性和可扩展性。本...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者”对象。在Android SDK源码中,观察者模式被广泛应用于对象间的通信,例如数据变更时的通知...
观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它在Android开发中被广泛应用于事件处理和状态同步。这种模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象...
- **观察者模式**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 - **迭代器模式**:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该...
3. **观察者模式** (Observer): `BroadcastReceiver`是Android中的典型观察者模式,它监听特定的广播事件并做出响应。当某个事件发生时,注册的接收器会接收到通知。 4. **适配器模式** (Adapter): `BaseAdapter`在...
观察者模式是Android中事件处理机制的基础,例如BroadcastReceiver、LiveData等。 ### 实战应用案例 - **单例模式**:在Android项目中,可以利用单例模式来管理全局的网络请求、数据库操作等。 - **适配器模式**:...
简单易懂的观察者模式
总的来说,《Android源码设计模式解析与实战》是一本深入浅出的Android设计模式教程,对于希望提升Android开发技能的工程师来说,是一份不可多得的学习资料。通过对书中的知识点进行深入学习和实践,开发者将能更好...
**Android设计模式之观察者模式** 观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它在Android开发中有着广泛的应用。该模式的主要目的是定义对象之间的一种一对多依赖关系,当一个对象的状态发生...
《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的专业书籍,适合已经有一定Android开发基础并希望进一步提升技术能力的开发者阅读。这本书旨在通过实例解析,帮助读者理解并掌握...