`
Iam42
  • 浏览: 275804 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android中的设计模式--观察者模式

 
阅读更多

“在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,一来它的对象都会收到通知”

场景:
某一个对象(或者数据)更新了,其他的一些类也要跟着变化,比如,在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();
  }
     

 

1
0
分享到:
评论

相关推荐

    Android设计模式--观察者模式DEMO

    Android设计模式--观察者模式DEMO 观察者模式是一个使用频率非常高的模式,他最常用的地方是GUI系统和订阅-发布系统。 该模式的最重要的作用就是解耦,使观察者和被观察者之间依赖尽可能小,甚至好无依赖。

    Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况

    总之,观察者模式在Android开发中扮演着重要角色,它能帮助我们构建松耦合、可扩展的系统,提高代码的复用性和可维护性。正确地理解和应用观察者模式,对于成为一名优秀的Android开发者至关重要。

    Android 设计模式学习之观察者模式应用实例

    本文将深入探讨一种常用的设计模式——观察者模式(Observer Pattern),并结合Android实际应用给出实例解析。 观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,...

    android学习日记-6 观察者模式与订阅者模式

    在Android开发中,观察者模式(Observer Pattern)和订阅者模式(Subscriber Pattern)是两种重要的设计模式,它们在实现事件驱动编程中起着关键作用。本文将深入探讨这两种模式的概念、工作原理以及在Android开发中...

    Android 设计模式:(一)观察者模式 —— 封装行为的大局观

    在Android开发中,设计模式是提升代码质量和可维护性的重要工具。本文将深入探讨其中的一种...在实际项目中,观察者模式与其他设计模式(如工厂模式、单例模式)结合使用,可以构建出更健壮、可扩展的Android应用程序。

    设计模式 观察者模式 以Android中TextView文本内容发生变化为背景

    观察者模式是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个背景下,我们以Android中的TextView为例,来深入...

    Android源码设计模式解析与实战.PDF(完整版)

    ### Android设计模式概述 #### 设计模式定义 设计模式是软件工程领域的一个重要概念,它代表着在特定场景下解决常见问题的有效方法。对于Android开发者而言,了解并掌握这些设计模式能够帮助他们编写更加高效、可...

    一个类实现Android观察者模式(最简单实用的观察者模式)

    观察者模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理事件响应和组件间的通信。这个模式允许对象订阅另一个对象的状态变化,当被观察的对象发生改变时,所有订阅者都会被通知并...

    观察者模式以及在Android开发中的应用

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这种模式被广泛应用于事件驱动编程和异步通信中。在Android...

    android常用设计模式

    观察者模式(Observer Pattern)是另一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。例如,AbstractCursor 类就是一个观察者模式的例子。 Android 设计模式系列还...

    Android-23种设计模式

    在Android开发中,设计模式是提升代码质量和可维护性的重要工具。设计模式是对软件设计中常见问题的解决方案的模板,经过时间和实践的检验,能够帮助开发者有效地解决复杂性问题,提高代码的重用性和可扩展性。本...

    Android设计模式系列(2)--SDK源码之观察者模式.pdf

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者”对象。在Android SDK源码中,观察者模式被广泛应用于对象间的通信,例如数据变更时的通知...

    Android观察者模式设计思想

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它在Android开发中被广泛应用于事件处理和状态同步。这种模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象...

    Java和Android源码设计模式 2017-03-21

    - **观察者模式**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 - **迭代器模式**:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该...

    Android源码设计模式

    3. **观察者模式** (Observer): `BroadcastReceiver`是Android中的典型观察者模式,它监听特定的广播事件并做出响应。当某个事件发生时,注册的接收器会接收到通知。 4. **适配器模式** (Adapter): `BaseAdapter`在...

    《Android源码设计模式解析与实战》PDF版本下载.txt

    观察者模式是Android中事件处理机制的基础,例如BroadcastReceiver、LiveData等。 ### 实战应用案例 - **单例模式**:在Android项目中,可以利用单例模式来管理全局的网络请求、数据库操作等。 - **适配器模式**:...

    Android设计模式——观察者模式

    简单易懂的观察者模式

    Android源码设计模式解析与实战 pdf 完整版

    总的来说,《Android源码设计模式解析与实战》是一本深入浅出的Android设计模式教程,对于希望提升Android开发技能的工程师来说,是一份不可多得的学习资料。通过对书中的知识点进行深入学习和实践,开发者将能更好...

    Android设计模式之观察者模式

    **Android设计模式之观察者模式** 观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它在Android开发中有着广泛的应用。该模式的主要目的是定义对象之间的一种一对多依赖关系,当一个对象的状态发生...

    Android源码设计模式解析与实战

    《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的专业书籍,适合已经有一定Android开发基础并希望进一步提升技术能力的开发者阅读。这本书旨在通过实例解析,帮助读者理解并掌握...

Global site tag (gtag.js) - Google Analytics