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. public void registerContentObserver(ContentObserver observer) {
  7. mContentObservable.registerObserver(observer);
  8. }
  9. public void unregisterContentObserver(ContentObserver observer) {
  10. // cursor will unregister all observers when it close
  11. if (!mClosed) {
  12. mContentObservable.unregisterObserver(observer);
  13. }
  14. }
  15. public void registerDataSetObserver(DataSetObserver observer) {
  16. mDataSetObservable.registerObserver(observer);
  17. }
  18. public void unregisterDataSetObserver(DataSetObserver observer) {
  19. mDataSetObservable.unregisterObserver(observer);
  20. }
  21. //2类通知方法
  22. protected void onChange(boolean selfChange) {
  23. synchronized (mSelfObserverLock) {
  24. mContentObservable.dispatchChange(selfChange);
  25. if (mNotifyUri != null && selfChange) {
  26. mContentResolver.notifyChange(mNotifyUri, mSelfObserver);
  27. }
  28. }
  29. }
  30. protected void notifyDataSetChange() {
  31. mDataSetObservable.notifyChanged();
  32. }
  33. }

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

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

  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).注意意外的更新,这也是观察者更新进行管理的原因之一。

时间: 2024-08-01 13:34:33

Android设计模式系列--观察者模式的相关文章

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

观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Pattern,是一个很实用的模式,本人曾经接触到的各种平台以及曾经参与项目中打印模板解释器中都用到了此模式. 1.意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.热门词汇:依赖 发布-订阅 事件 通知 更新 监听 2.结构 这是一个最简单的观察者模式

android设计模式之--观察者模式

最近比较忙,好久没有更新博客了,今天就将最近研究的一个东西总结一下,最近在维护公司的一个项目,我负责的模块主要是下载杂志后及时的更新UI,将最新的下载进度更新到UI上,中间遇到的一个问题是:同一个对象的下载进度会有多个Item监听它的状态,也就是说一个进度要更新到多个Item上,开始没有什么头绪,百度一番后发现了观察者模式这个东西,它就是为了满足这种一对多问题而出现的. 有了思路以后,就着手开始了解观察者模式是如何工作的,虽然以前知道设计模式里有这个东西,但还真是没用过,下面就讲解一下观察者模式

Android 设计模式之观察者模式

观察者设计模式的定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 面向对象设计原则:为交互对象之间的松耦全设计而努力 在我们实际应用中,还会遇到一对一.或者多对一的情况.一对一就是,一个目标对应一个观察者.多对一是指多个目标对应一个观察者. 松耦合的好处: 一.是它适应变化的灵活性: 二.是当某个服务的内部结构和实现逐渐发生改变时,不影响其他服务 它的类图 观察者模式在Android系统中的应用还是相当广泛的,如监听器 public voi

Android设计模式系列--工厂方法模式

工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式.android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具管理类.今天以ThreadFactory举例说明一下简单工厂模式和工厂方法模式. 工厂方法模式,Factory Method,简单的方式,不简单的应用. 1.意图定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方式模式使一个类的实例化延迟到其子类.热门词汇:虚构造器 延迟 创建对象 子类 2

Android设计模式系列(3)--SDK源码之单例模式

单例模式,可以说是GOF的23种设计模式中最简单的一个.这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式.android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析.单例模式,Singleton Pattern,能够以其特有的优势,替代系统中全局变量,应用非常广泛. 1.意图保证一个类仅有一个实例,并提供一个访问它的全局访问点.热门词

【设计模式篇】Android设计模式之-观察者模式 自我见解

观察者模式在Android广泛的使用.现在结合自己的理解,并且写一个简单demo. 当老师讲课的时候,老师就是一个被观察者,他应该继承于Observer 学生听课的时候,就是观察者,他应该实现观察者的接口. 这样的话,老师讲课的时候,学生都能收到消息了 package com.ferris.observice; import java.util.Observable; import java.util.Observer; import android.content.Context; impor

Android设计模式系列-单例模式

单例模式,可以说是GOF的23种设计模式中最简单的一个. 这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式.android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析.单例模式,Singleton Pattern,能够以其特有的优势,替代系统中全局变量,应用非常广泛. 1.意图保证一个类仅有一个实例,并提供一个访问它的全局访问点.热门

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

观察者模式 观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性.观察者设计模式非常常用,在一般复杂的WEB系统中,观察者模式可以帮你减轻代码设计的压力,降低代码耦合. 场景设计 设计一个订单类 订单创建完成后,会做各种动作,比如发送EMAIL,或者改变订单状态等等. 原始的方法,是将这些操作都写在create函数里面 但是随着订单创建类的越来越庞大,这样的操作已经无法满足需求和快速变动 这个时候,观察者模式出现了. 代码设计: <?php //观察者设计模

Android设计模式系列(1)--SDK源码之组合模式

Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Composite Pattern,是一个非常巧妙的模式.几乎所有的面向对象系统都应用到了组合模式. 1.意图将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分).组合模式使得用户对单个对象View和组合对象ViewGroup的使