Android设计模式系列(2)--SDK源码之观察者模式.docx
《Android设计模式系列(2)--SDK源码之观察者模式.docx》由会员分享,可在线阅读,更多相关《Android设计模式系列(2)--SDK源码之观察者模式.docx(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、基本简介观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。实现方式观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。在刚才的例子中,业务数据是被观察对象,用户界面是观察者。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察
2、者就会观察到这样的变化,并且做出相应的响应。如果在用户界面、业务数据之间使用这样的观察过程,可以确保界面和数据之间划清界限,假定应用程序的需求发生变化,需要修改界面的表现,只需要重新构建一个用户界面,业务数据不需要发生变化。 “观察”不是“直接调用”实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。实现观察者模式的过程实现观察者模式有很多形式,比较直观的一种是使用一种“注册通知撤销注册”的
3、形式。下面的三个图详细的描述了这样一种过程:1、观察者(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。2、被观察对象被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。3、撤销观察观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变
4、化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现这一点为程序提供了更大的灵活性。观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。本文以AbstractCursor为例子,展开分析。观察者模式,Observer Pattern,是一个很实用的模式,本人曾经接触到的各种平台以及曾经参与项目中打印模板解释器中都用到了此模式。1.意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。热门词汇:依赖 发布-订阅 事件 通知 更新 监听 2.结构这是一个最简单的观察者模式
5、,目标对象能够添加和删除观察者,当自己某种状态或者行为发生改变时,可通过notify通知注册的观察者进行更新操作。分析AbstractCursor的具体情况,我们发现实际工作有时需要对观察者进行统一管理,甚至观察者类型有很多种而又可以分成几个系列,这个时候是要复杂的多,通过合理的分层这个问题很好解决。下面根据具体情况,我们画出android中abstractCurosr中用到的观察者模式结构图:观察者分成了两个系列。3.代码列举其中相关核心代码如下:1. public abstract class AbstractCursor 2. /定义管理器3. DataSetObservable mDa
6、taSetObservable = 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(ContentObserve
7、r observer) 12. / cursor will unregister all observers when it close13. 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 unregiste
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 设计 模式 系列 SDK 源码 观察者
限制150内