`
yehoubin
  • 浏览: 24332 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android设计模式系列--观察者模式

 
阅读更多

观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。
本文以AbstractCursor为例子,展开分析。
观察者模式,Observer Pattern,是一个很实用的模式,本人曾经接触到的各种平台以及曾经参与项目中打印模板解释器中都用到了此模式。

1.意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
热门词汇:依赖 发布-订阅 事件 通知 更新 监听 

2.结构


这是一个最简单的观察者模式,目标对象能够添加和删除观察者,当自己某种状态或者行为发生改变时,可通过notify通知注册的观察者进行更新操作。
分析AbstractCursor的具体情况,我们发现实际工作有时需要对观察者进行统一管理,甚至观察者类型有很多种而又可以分成几个系列,这个时候是要复杂的多,通过合理的分层这个问题很好解决。下面根据具体情况,我们画出android中abstractCurosr中用到的观察者模式结构图:


观察者分成了两个系列。

3.代码
列举其中相关核心代码如下:

  1. public abstract class AbstractCursor {  
  2.     //定义管理器  
  3.     DataSetObservable mDataSetObservable = new DataSetObservable();  
  4.     ContentObservable mContentObservable = new ContentObservable();  
  5.        
  6.     //注册和卸载两类观察者  
  7.     public void registerContentObserver(ContentObserver observer) {  
  8.         mContentObservable.registerObserver(observer);  
  9.     }  
  10.    
  11.     public void unregisterContentObserver(ContentObserver observer) {  
  12.         // cursor will unregister all observers when it close  
  13.         if (!mClosed) {  
  14.             mContentObservable.unregisterObserver(observer);  
  15.         }  
  16.     }  
  17.    
  18.     public void registerDataSetObserver(DataSetObserver observer) {  
  19.         mDataSetObservable.registerObserver(observer);  
  20.            
  21.     }  
  22.    
  23.     public void unregisterDataSetObserver(DataSetObserver observer) {  
  24.         mDataSetObservable.unregisterObserver(observer);  
  25.     }  
  26.    
  27.     //2类通知方法  
  28.     protected void onChange(boolean selfChange) {  
  29.         synchronized (mSelfObserverLock) {  
  30.             mContentObservable.dispatchChange(selfChange);  
  31.             if (mNotifyUri != null && selfChange) {  
  32.                 mContentResolver.notifyChange(mNotifyUri, mSelfObserver);  
  33.             }  
  34.         }  
  35.     }  
  36.    
  37.     protected void notifyDataSetChange() {  
  38.         mDataSetObservable.notifyChanged();  
  39.     }  
  40. }  

再看看Observable<T>类和DataSetObservable类:

  1. public abstract class Observable<T> {  
  2.     /**  
  3.      * 观察者列表  
  4.      */ 
  5.     protected final ArrayList<T> mObservers = new ArrayList<T>();  
  6.    
  7.     public void registerObserver(T observer) {  
  8.         if (observer == null) {  
  9.             throw new IllegalArgumentException("The observer is null.");  
  10.         }  
  11.         synchronized(mObservers) {  
  12.             if (mObservers.contains(observer)) {  
  13.                 throw new IllegalStateException("Observer " + observer + " is already registered.");  
  14.             }  
  15.             mObservers.add(observer);  
  16.         }  
  17.     }  
  18.    
  19.    
  20.     public void unregisterObserver(T observer) {  
  21.         if (observer == null) {  
  22.             throw new IllegalArgumentException("The observer is null.");  
  23.         }  
  24.         synchronized(mObservers) {  
  25.             int index = mObservers.indexOf(observer);  
  26.             if (index == -1) {  
  27.                 throw new IllegalStateException("Observer " + observer + " was not registered.");  
  28.             }  
  29.             mObservers.remove(index);  
  30.         }  
  31.     }  
  32.        
  33.     public void unregisterAll() {  
  34.         synchronized(mObservers) {  
  35.             mObservers.clear();  
  36.         }          
  37.     }  
  38. }  

  1. public class DataSetObservable extends Observable<DataSetObserver> {  
  2.     /**  
  3.      * 数据发生变化时,通知所有的观察者  
  4.      */ 
  5.     public void notifyChanged() {  
  6.         synchronized(mObservers) {  
  7.             for (DataSetObserver observer : mObservers) {  
  8.                 observer.onChanged();  
  9.             }  
  10.         }  
  11.     }  
  12.     //... ... (其他方法)  
  13. }  

观察者DataSetObserver类是一个抽象类:

  1. public abstract class DataSetObserver {  
  2.     public void onChanged() {  
  3.         // Do nothing  
  4.     }  
  5. }  

所以我们具体看它的子类:

  1. public class AlphabetIndexer extends DataSetObserver{  
  2.     /*  
  3.      * @hide 被android系统隐藏起来了  
  4.      */ 
  5.     @Override 
  6.     public void onChanged() {  
  7.         //观察到数据变化,观察者做自己该做的事情  
  8.         super.onChanged();  
  9.         mAlphaMap.clear();  
  10.     }  
  11. }  

ContentObserver也是类似。

4.效果
(1).行为型模式
(2).目标和观察者间的抽象耦合(经典实现)。
(3).支持广播通信(相信这点android开发者看到后应该有启发吧)。
(4).注意意外的更新,这也是观察者更新进行管理的原因之一。

 

出自:http://mobile.51cto.com/ahot-418990.htm

分享到:
评论

相关推荐

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

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

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

    观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ### 一、观察者模式概念 观察者模式的核心思想是让主题(Subject)...

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

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

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

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

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

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

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

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

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

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

    android常用设计模式

    Android 设计模式系列还包括工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式、适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式、解释器模式、模板方法模式、职责链模式、命令...

    Android设计模式(详细讲解了10个Android设计模式)

    详细讲解了组合模式、观察者模式、单例模式、模板方法模式、备忘录模式、享元模式、命令模式、工厂方法模式、适配器模式 原型模式等10个Android设计模式,和CSDN上其他讲Android设计模式的文章完全不同。讲解详细,...

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

    简单易懂的观察者模式

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

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

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

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

    Android-23种设计模式

    Android的`BroadcastReceiver`和`LiveData`都采用了观察者模式。 11. **命令模式(Command)**:将请求封装为一个对象,以便使用不同的请求、队列请求或支持可撤销的操作。Android的`MenuItem`和`OptionsItemSelected...

    android设计模式

    "android设计模式"这一主题,主要涵盖了一些常见的设计原则、模式以及如何在Android环境中应用它们。《设计模式之禅》作为一本经典著作,其深入浅出的讲解方式使得读者能够轻松掌握设计模式的核心理念。 1. **设计...

    Android设计模式之观察者模式

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

    Android设计模式

    - **观察者模式**:Android中的BroadcastReceiver和EventBus就是观察者模式的应用,用于组件间的通信。 - **责任链模式**:处理Android中的触摸事件分发机制,Activity、ViewGroup和View形成一个处理链。 - **...

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

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

    Android观察者模式设计思想

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

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

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

    android 观察者模式样例代码

    观察者模式在android中的小样例 通过按钮增加观察者 Observer 并且维护一个观察者list 当被观察者状态变化的时候 所有的观察者都收到了通知 并且所有的观察者都更新了自己的信息 通过update方法

Global site tag (gtag.js) - Google Analytics