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

本文详细解读了Android系统中AbstractCursor类如何利用观察者模式实现目标和观察者之间的抽象耦合,支持广播通信,并讨论了如何进行意外更新的管理。文章深入分析了AbstractCursor的具体实现细节,包括管理器、观察者注册与注销方法,以及核心代码的解析。同时,介绍了Observable<T>类、DataSetObservable类和DataSetObserver类的作用,以及它们在观察者模式中的角色。此外,文章还探讨了观察者模式在Android系统中的应用效果,如支持广播通信、意外更新管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

2.结构


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


观察者分成了两个系列。

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

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

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

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

  和

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

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

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

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

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

  ContentObserver也是类似。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值