您的位置:首页 > 移动开发 > Android开发

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

2014-01-20 10:44 656 查看
观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。

本文以AbstractCursor为例子,展开分析。

观察者模式,Observer Pattern,是一个很实用的模式,本人曾经接触到的各种平台以及曾经参与项目中打印模板解释器中都用到了此模式。

1.意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

热门词汇:依赖 发布-订阅 事件 通知 更新 监听

2.结构



这是一个最简单的观察者模式,目标对象能够添加和删除观察者,当自己某种状态或者行为发生改变时,可通过notify通知注册的观察者进行更新操作。

分析AbstractCursor的具体情况,我们发现实际工作有时需要对观察者进行统一管理,甚至观察者类型有很多种而又可以分成几个系列,这个时候是要复杂的多,通过合理的分层这个问题很好解决。下面根据具体情况,我们画出android中abstractCurosr中用到的观察者模式结构图:



观察者分成了两个系列。

3.代码

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

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

  和

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

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

  ContentObserver也是类似。

事例2:Broadcast receivers are Android’s implementation of the Publish/Subscribe messaging pattern

在android系统中“广播”是发布订阅模式的典型应用。

定义对象间的一种一对多的依赖关系,发布者不需要知道订阅者是谁。当一个状态发生改变时, 所有监听它的观察者对象都得到通知并被自动更新。

例子如下:

(1)TimelineReceiver是观察者;

(2)重写OnReceive方法,来定义当收到状态变化时,订阅者的行为;

[b][java] view
plaincopy[/b]

...

class TimelineReceiver extends BroadcastReceiver { // 1

@Override

public void onReceive(Context context, Intent intent) { // 2

cursor.requery(); // 3

adapter.notifyDataSetChanged(); // 4

Log.d("TimelineReceiver", "onReceived");

}

}

...

(3)注册和反注册

[b][java] view
plaincopy[/b]

registerReceiver(receiver, filter);

......

unregisterReceiver(receiver);

4.效果

(1).行为型模式

(2).目标和观察者间的抽象耦合(经典实现)。

(3).支持广播通信(相信这点android开发者看到后应该有启发吧)。

(4).注意意外的更新,这也是观察者更新进行管理的原因之一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: