Android设计模式系列(2)--SDK源码之观察者模式.docx_第1页
Android设计模式系列(2)--SDK源码之观察者模式.docx_第2页
Android设计模式系列(2)--SDK源码之观察者模式.docx_第3页
Android设计模式系列(2)--SDK源码之观察者模式.docx_第4页
Android设计模式系列(2)--SDK源码之观察者模式.docx_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基本简介观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。实现方式观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。在刚才的例子中,业务数据是被观察对象,用户界面是观察者。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。如果在用户界面、业务数据之间使用这样的观察过程,可以确保界面和数据之间划清界限,假定应用程序的需求发生变化,需要修改界面的表现,只需要重新构建一个用户界面,业务数据不需要发生变化。 “观察”不是“直接调用”实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。实现观察者模式的过程实现观察者模式有很多形式,比较直观的一种是使用一种“注册通知撤销注册”的形式。下面的三个图详细的描述了这样一种过程:1、观察者(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。2、被观察对象被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。3、撤销观察观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现这一点为程序提供了更大的灵活性。观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。本文以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. /注册和卸载两类观察者7. public void registerContentObserver(ContentObserver observer) 8. mContentObservable.registerObserver(observer);9. 10.11. public void unregisterContentObserver(ContentObserver 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 unregisterDataSetObserver(DataSetObserver observer) 24. mDataSetObservable.unregisterObserver(observer);25. 26.27. /2类通知方法28. protected void onChange(boolean selfChange) 29. synchronized (mSelfObserverLock) 30. mContentObservable.dispatchChange(selfChange);31. if (mNotifyUri != null & selfChange) 32. mContentResolver.notifyChange(mNotifyUri, mSelfObserver);33. 34. 35. 36.37. protected void notifyDataSetChange() 38. mDataSetObservable.notifyChanged();39. 40. 复制代码再看看Observable类和DataSetObservable类: 1. public abstract class Observable 2. /*3. * 观察者列表4. */5. protected final ArrayList mObservers = new ArrayList();6.7. public void registerObserver(T observer) 8. if (observer = null) 9. throw new IllegalArgumentException(The observer is null.);10. 11. synchronized(mObservers) 12. if (mObservers.contains(observer) 13. throw new IllegalStateException(Observer + observer + is already registered.);14. 15. mObservers.add(observer);16. 17. 18.19.20. public void unregisterObserver(T observer) 21. if (observer = null) 22. throw new IllegalArgumentException(The observer is null.);23. 24. synchronized(mObservers) 25. int index = mObservers.indexOf(observer);26. if (index = -1) 27. throw new IllegalStateException(Observer + observer + was not registered.);28. 29. mObservers.remove(index);30. 31. 32.33. public void unregisterAll() 34. synchronized(mObservers) 35. mObservers.clear();36. 37. 38. 复制代码和DataSetObservable : 1. public class DataSetObservable extends Observable 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 nothing4. 5. 6.复制代码所以我们具体看它的子类: 1. public class AlphabetIndexer extends DataSetObserver2. /*3. * hide 被android系统隐藏起来了4. */5. Override6. public void onChanged() 7. /观察到数据变化,观察者做自己该做的事情8. super.onChanged();9. mAlphaMap.cle

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论