观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。
本文以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();
//注册和卸载两类观察者
public void registerContentObserver(ContentObserver observer) {
mContentObservable.registerObserver(observer);
}
public void unregisterContentObserver(ContentObserver observer) {
// cursor will unregister all observers when it close
if (!mClosed) {
mContentObservable.unregisterObserver(observer);
}
}
public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}
public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}
//2类通知方法
protected void onChange( boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange);
if (mNotifyUri != null && selfChange) {
mContentResolver.notifyChange(mNotifyUri, mSelfObserver);
}
}
}
protected void 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> {
/**
* 观察者列表
*/
protected final ArrayList<T> mObservers = new ArrayList<T>();
public void registerObserver(T observer) {
if (observer == null ) {
throw new IllegalArgumentException( "The observer is null." );
}
synchronized (mObservers) {
if (mObservers.contains(observer)) {
throw new IllegalStateException( "Observer " + observer + " is already registered." );
}
mObservers.add(observer);
}
}
public void unregisterObserver(T observer) {
if (observer == null ) {
throw new IllegalArgumentException( "The observer is null." );
}
synchronized (mObservers) {
int index = mObservers.indexOf(observer);
if (index == - 1 ) {
throw new IllegalStateException( "Observer " + observer + " was not registered." );
}
mObservers.remove(index);
}
}
public void unregisterAll() {
synchronized (mObservers) {
mObservers.clear();
}
}
} |
和
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class DataSetObservable extends Observable<DataSetObserver> {
/**
* 数据发生变化时,通知所有的观察者
*/
public void notifyChanged() {
synchronized (mObservers) {
for (DataSetObserver observer : mObservers) {
observer.onChanged();
}
}
}
//... ... (其他方法)
} |
观察者DataSetObserver类是一个抽象类:
1
2
3
4
5
|
public abstract class DataSetObserver {
public void onChanged() {
// Do nothing
}
} |
所以我们具体看它的子类:
1
2
3
4
5
6
7
8
9
10
11
|
public class AlphabetIndexer extends DataSetObserver{
/*
* @hide 被android系统隐藏起来了
*/
@Override
public void onChanged() {
//观察到数据变化,观察者做自己该做的事情
super .onChanged();
mAlphaMap.clear();
}
} |
ContentObserver也是类似。
4.效果
(1).行为型模式
(2).目标和观察者间的抽象耦合(经典实现)。
(3).支持广播通信(相信这点android开发者看到后应该有启发吧)。
(4).注意意外的更新,这也是观察者更新进行管理的原因之一。
相关推荐
Android设计模式系列(2)--SDK源码之观察者模式.pdf
opencv-3.4.4-android-sdk/sdk/build.gradle opencv-3.4.4-android-sdk/sdk/etc opencv-3.4.4-android-sdk/sdk/java
opencv-3.4.13-android-sdk .zip压缩包
本篇文章介绍了,基于Android设计模式之--SDK源码之策略模式的详解。需要的朋友参考下
Android Framework Source Code , sdk19的源码,附关联方法: 打开Eclipse,随便新建一个Android项目,在此项目目录下面有个Android 4.4,点击展开遍出现了android.jar。右键此包---->Properties,在弹出的窗口中,...
arcgis-android-sdk-v10.2.3,arcgis for android 开发的工具库,导入eclipse即可
taobao-sdk-java-auto源码, taobao-sdk-java-auto源码, taobao-sdk-java-auto源码, taobao-sdk-java-auto源码
opencv-4.5.4-android-sdk .zip
opencv-4.6.0-android-sdk.zip
android 4.1 最新SDK Windows版: http://s1.eoeandroid.com/sdk/4.1/android-sdk_r20-windows.zip(推荐) http://s1.eoeandroid.com/sdk/4.1/installer_r20-windows.exe Mac版: ...
将android-17.zip解压到 Android\android-sdk\platforms 文件夹下。
arcgis-android-sdk-10.2.8-1
android-sdk-windowsandroid-sdk-windowsandroid-sdk-windowsandroid-sdk-windowsandroid-sdk-windowsandroid-sdk-windowsandroid-sdk-windows
最新release的opencv 4.5.0 android sdk, 有需要的同学可以下载了。最新release的opencv 4.5.0 android sdk。
百度ORC识别aip-ocr-android-sdk-1.4.3.rar
Android SDK (SDK Platforms)-android-30.zip
Android-sceneform-android-sdk.zip,面向android的sceneform sdk,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
card.io SDK for Android card.io provides fast, easy credit card scanning in mobile apps. Stay up to date Please be sure to keep your app up to date with the latest version...Subscribe to our card-io-sdk-
将android-18解压到Android\android-sdk\platforms下。
官方版本,亲测可用